2012/10/06

iOSアプリの画面遷移 + データの引き継ぎ(激闘編)

こんにちは。最近、本業がプチ炎上しているたーせるです。どうしてこうなったし。

閑話休題。

今日のお便りコーナーは、筑波の学園都市で暮らす ぬっくんから。

というわけで、ぬっくんが挫折したポイントに僕も挑んでみようと思います(下図は、前画面から引き継いだデータを表示するイメージです)。


あ、言い忘れましたが、ぬっくんは GUI ビルダー(Story Board)がお嫌いらしい。


ので、そこらへんも考慮して Story Board 不使用という縛りプレイで、画面遷移時のデータ引き継ぎを実装してみる事にしましょう。

2012/09/21

【Objective-C++】ARCとstd::shared_ptr

季節は、秋である。


僕はRetina MacBook Proを買って以来、iPhone 5を予約したり天国のスティーブジョブズ様に祈りを捧げたりと大忙しで、ブログの更新をサボりがちになっていた。

さて。

そんなAppleの先進的なプロダクトの中核をなす開発言語と言えば、Objective-Cである。

嘗てはC言語の陰に隠れてマイナーなポジションに在った言語であるが、昨今のiPhoe / iPadの普及に伴い、その知名度もようやく上がりつつある。

というわけで、僕もObjective-Cに再挑戦してみようと思い、荻原剛志著『詳解Objective-C 2.0 第3版』なんぞを買ってきて読んで今に至るわけである。

ここから本題であるが、Objective-Cを用いてプログラミングを行う上でネックなポイントが『メモリ管理』であった。この話は去年の3月頃にも一度書いた気がする。

あれから時代は流れ、Objective-Cではメモリ管理を自動化するための ARC (Automatic Reference Counting) という機能が使用できるようになった。もうretainやらreleaseやら手作業でリファレンスカウンタをいじらなくてもよいのだ。

しかし、例えば僕がiPhoneアプリを開発する事になり、UIまわりをObjective-Cで、ロジックをC++でそれぞれコーディングする事にしたとしよう。この場合、UIからロジックにアクセスするために、Objective-C側は何らかの方法でC++側のオブジェクトを参照しておく必要がある。

残念ながらARC は C++ の生ポインタを自動解放してはくれないため、このままではObjective-C側にC++のメモリ解放コードが混在する穢らわしいコードになってしまう。安全性も下がる。たちまちメモリリークが発生し、またたく間にアプリが落ち、やがてApp Storeのレビューには心ないユーザからの罵詈雑言が書き込まれる事だろう。

だが悲観するには早い。

2011年8月12日(僕の誕生日!)に、C++の最新規格であるC++11がISOに承認され、参照カウンタを自動制御できるスマートポインタという仕組みが正式に導入された。

Visual Studioはどうか知らんが、最新のXcode 4.5ではC++11をサポートしている。これでObjective-C、C++ともにメモリ周りにおける懸念がずいぶん軽減された事になる。

しかしながら、ARCはObjective-Cだけの機能であり、スマートポインタはC++だけの機能である。

ここで、一つの疑問が生じた(ほこ×たてっぽく)。

【Objective-CのARCとC++のスマートポインタは共存できるのか】


というわけで、いろいろ実験してみたよー。今日の記事は備忘録的側面が強いので、何言ってるのか分からんという方は読み飛ばして下さい。

1. まずはARCを使ってみる

#import <Foundation/Foundation.h>
#import <cstdio>

/* 宣言部 */
@interface ObjectiveTercel : NSObject
-(id) init;
-(void) dealloc;
@end

/* 実装部 */
@implementation ObjectiveTercel

-(id) init {        // イニシャライザ
    self = [super init];
    printf("[こんにちは]\n");
    return self;
}

-(void) dealloc {   // ファイナライザ
    printf("[さようなら]\n");
}
@end

/* main関数 */
int main(int argc, const char * argv[])
{
    @autoreleasepool {
        ObjectiveTercel* tercel = [[ObjectiveTercel alloc] init];
    }
    return 0;
}


これは適当なクラスを作り、それをインスタンス化するコードである。

main()関数の内部では、インスタンスをポインタ参照している。動的にメモリをアロケートしているため、従来は明示的な解放コードが必要であった。

しかし、上記のコードを実行してみると、@autorelease ブロックを抜けるタイミングで dealloc が呼ばれ、メモリ解放が行われる。実行結果は以下の通りだ。

[こんにちは]
[さようなら]

もちろん、この手品にはタネがあり、ARCのために導入された構文上の制限を守らねばならないのだが。

2012/09/08

インドの写真あれこれ

昨日も少し書いたが、私はおよそ1ヶ月間ほどインドに滞在していた。というわけで、現地で撮影した写真の数々を一挙大放出したいと思う。



【食べ物篇】

現地の食事はスパイスが効いており芳香が強いため、好みは分かれるかも知れない。ちなみに私の口には合った。

朝食。コーンフレークとトースト
インドといえばやはりカレー
バナナの葉っぱ
インド人は右手だけを器用に使い、食物をぐちゃぐちゃとかき混ぜて食べる。

僕はスプーンを使わせてもらった。

2012/09/07

MacBook Pro (Retina) を買いました

お久しぶりです。

しばらく海外に出張しており、大人の事情でブログの更新ができずにおりました。

今は無事に帰国し、再びのんびり会社員として暮らしております。

さて、このたびMacに乗り換える事にいたしました。仕事上の都合というわけではなく、全くの個人的な趣味です。

とりあえず最低限の初期設定を終え、このブログを書いているところです。



Macに換えて、まず画面が非常に美しい点に驚きました。

ドット感(ジャギー)が全く無い事、フォントが非常に美しい事、画面全体に統一感がある事などなど、今まで使用していたマシンとはだいぶ感性品質が異なると感じています。

こんな駄文ですら拡張高く見えるから不思議です。

一方でキーボードの打鍵感やトラックパッドの使い心地にはまだ戸惑う事もあり、早く慣れたいと思う次第であります。

そんなこんなで、土日は書店でMacとお友達になる本を物色したいなぁと思うたーせるなのでした(今日のわんこ風)。

2012/06/23

データベーススペシャリストに合格しました / ほか

皆様、お久しぶりです。

実は、5月31日に、それまで住んでいた社員寮を退寮し、今は都内のマンションで一人暮らしをしております。 お給料はお部屋作りに消えましたが、その甲斐あってだいぶ住みよい環境が出来上がりつつあります。

そして本日、ようやっと新居のネット環境が整い、ふたたびブログを更新できるようになりました。

さてさて。

このたび、4月に受験したデータベーススペシャリストの合格発表がありました。

結果は、ギリギリの成績で合格でした。


さすがにネットワークスペシャリストに受かったときほどの感動はありませんが、なんだかんだ言って合格率1割台の難関資格。 やはり合格は嬉しいものです。



少し話は変わりますが、来月から初めての海外出張に行って参ります。

それなりに長い期間、日本を離れる事になりますので、またしてもブログの更新が滞りそうな予感がします。

どうか温かく見守って頂けたら幸いです。