頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


autoreleaseによるメモリ解放について誤解してた

何かとややこしいObjective-Cのメモリ解放(もちろんiPhoneアプリ作成時の話です)。

動作チェック用でこんな感じで、あるオブジェクトを作ったのです。
まず、HogeViewController.hで
NSDate *date;
とインスタンス変数として宣言しときました。

で、HogeViewController.mのイニシャライザ部分で
date = [NSDate date];
とオブジェクトを作ったのです。
この作り方だとautoreleaseだから自分でreleaseは不要(してはいけない)ですよね。

このHogeViewControllerクラスはタブバーアプリで表示されるページの1つなんですが、タブを切り替えて再度このHogeViewControllerクラスのビューを表示させる時にはdateはすっからかんになってるんです(viewWillAppear内で確認)。

え?あー、そうなの?
解放されちゃうの?
と気付くまでにえらく時間を無駄にしましたよ、、、

インスタンス変数として宣言しとけば、漠然とそのクラスのオブジェクトが破棄されるまで使えるんだ、なんて油断しておりました。

<< NSMutableStringでタブ間データのやりとり  TopPage  Xcode3.2.4 and iOS SDK 4.1をダウンロードした >>

コメント

date = [[NSDate date]retain];
でどうでしょうか?

@property (nonatomic,retain)NSDate *date;
して、インスタンス直接では無く、セッター経由で、
self.date = [NSDate date];の方がいいような気もしますが...

2010.09.13   チェリー   編集

Re: タイトルなし

コメントありがとうございます。

> date = [[NSDate date]retain];
> でどうでしょうか?

そうですね、そうすれば動きますね。

> @property (nonatomic,retain)NSDate *date;
> して、インスタンス直接では無く、セッター経由で、
> self.date = [NSDate date];の方がいいような気もしますが...

なるほど、すっきりしますね。
こういう使い方ってよくあるんですかね?
なんとなくプロパティというのは外部からのアクセスがあるものって気がしてて。
自分もこういう使い方はするのですが、何だか釈然としないものがあったりします、、、

2010.09.15   たつや   編集


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/445-f5a19612




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad