Objective-Cをなんとなく使い続けていたのですが、分かってるようであまり分かっていなかったのがプロパティ。
retain/release/autorelease周りとの絡みもあってなんとなくやり過ごしていたのですが、ちょっと切羽詰ってきたので仕切りなおして勉強してみました。
NSStringを持つクラスでテスト
いろいろ調べた結果、とりあえず、下記のようなクラスStringContainerを定義しておけば問題なく使えるっぽいです。(問題見つけたら教えてください!)
まずは、定義ファイル。内部にNSString*のインスタンス変数を二つと、そのプロパティ宣言を行っています。
重要なポリシーは、propertyは内部でコピーする、ということ。下記のページを参考にしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 | // StringContainer.h #import <Foundation/Foundation.h> @interface StringContainer : NSObject { NSString* str0; NSString* str1; } // コピーするので、渡すものはautoreleaseしておいてください. @property (nonatomic,copy) NSString* str0; @property (nonatomic,copy) NSString* str1; @end |
次に実装コードです。プロパティ設定のためのsynthesizeと、デストラクタを定義しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // StringContainer.m #import "StringContainer.h" @implementation StringContainer @synthesize str0, str1; -(void) dealloc{ [super dealloc]; [str0 release]; [str1 release]; } @end |
そして、テストコード。str0とstr1では別の与え方をしてみました。
1 2 3 4 5 6 7 8 | // Test.m // 確保. StringContainer* scTest; scTest = [[StringContainer alloc] init]; // 各パラメータを設定. scTest.str0 = [NSString stringWithFormat:@"Default 0[%d]",0]; scTest.str1 = [[[NSString alloc] initWithFormat:@"Changed 1[%d]",11] autorelease]; |
str0に渡す文字列は、stringWithFormatはクラスメソッドで生成。なので、そこで生成されたオブジェクトはそちらでAutoRelease Poolに入っているようなので、特にrelease/autoreleaseを行う必要はありません。むしろ、それをやると、retain countが0になったときに、二重にreleaseが呼ばれるので、問題となります。
str1に渡す文字列は、alloc, initで生成したもの。ここで生成しているので、ここでautoreleaseしています。代入後に即releaseしても問題有りませんが、ここでrelease/autoreleaseのどちらかを行っていないと、そのメモリは破棄されないので、リークしてしまいます。
これでOKのハズ!
一応、Instrumentsツールを使ってリークを調べたりもしたので、これで大丈夫だと思うのですが、認識に問題があったら誰か教えて欲しいです!!!
たったこれだけのことを自信持ってかけるようになるのに半日かかりました!
AutoRelease Poolというものの存在、クラスメソッドで定義したものがそちらで勝手にautoreleaseされているっぽい、ということ、それらをググって知ったので理解できたのですが、そうでなかったらなかなか辿り着けないのです。
ちなみに、NSArrayも同様な書き方でプロパティ実装できるはずです。
[AD]
↓この本、買いました!ウェブで連載されていたコラムの総集編とiPhone Hackコラムの書き下ろし。読み物として書かれているので、飽きずに読めてる!Objective-Cの実装部分まで踏み込んでいるので、ダイナミック言語としての面白さを知ることができるし、後半ではデザインパターンの実装の話にもなる。
著者/訳者:木下 誠
出版社:ビー・エヌ・エヌ新社( 2009-03-27 )
定価:¥ 3,360
Amazon価格:¥ 3,360
単行本 ( 456 ページ )
ISBN-10 : 4861006414
ISBN-13 : 9784861006418
↓これも店頭で見ていい!と思って買いました。iPhoneプログラムのコネタ集なんだけど、一つ一つが過不足無く説明とコードが書かれていて、本当にすばらしい!版型もちょっと小さいので、鞄に入れて移動中に気になるところをちょっとずつ読むスタイルもオススメ。
著者/訳者:高山 恭介 広部 一弥 松浦 晃洋
出版社:秀和システム( 2010-03 )
定価:¥ 2,520
Amazon価格:¥ 2,520
単行本 ( 319 ページ )
ISBN-10 : 4798025798
ISBN-13 : 9784798025797















