[Objective-C] Obj-C2.0〜アクセサ
iPhone2.0以降,Leopard以降は,Obj-C2.0となった.ガーベッジコレクションをサポートし,今までとは若干違う部分が増えた様子.
iPhoneのプログラミングをするかもしれないし,ちょっと勉強してみる.
※参考文献
・http://devworld.apple.com/jp/documentation/cocoa/Conceptual/ObjectiveC/Articles/chapter_5_section_3.html
・http://journal.mycom.co.jp/column/objc/index.html
※アクセサ
以前の場合,@publicで直接アクセスするようにできた.
@interface Hoge : NSObject { @public NSString* name; } @end 〜 Hoge* obj = [[Hoge alloc] init]; obj->name = @"test";
危険だけど.以下がObjective-C2.0のとき.
@interface Hoge : NSObject { NSString* name_; } @property (retain) NSString* name; @end @implementation Hoge @synthesize name = name_; @end
@synthesizeを宣言すると属性に応じたアクセサが自動的に生成される.
このため,上のコードでは,以下のようにアクセスできるようになる.
Hoge* obj = [[Hoge alloc] init]; obj.name = @"test"; NSLog( obj.name );
()の中は属性.属性には,以下のようにretain,assign,copy,nonatomicなどがある様子.
・getter=getterName, setter=setterName,アクセサのメソッドの名前を付けられる
・readonly,明示的に書き込みを禁止する
・readwrite,デフォルト.
・assign,参照だけを渡す
・retain,参照だけではなく,
・copy,参照元をコピーして,そのコピーしたものを保存.
・nonatomic,スレッドセーフ関連?マルチスレッド時に確実にアクセスできるようにするatomic設定を非設定にする属性(多分).
たとえば,retainの場合は,以前のObj-C1.0だとこんなコードのアクセサが提供されると考える.
- (void) setName:(NSString*) input { if( name_ != input ) { if( name_ != nil ) [name_ release]; name_ = [input retain]; } }
なーるほどね.
ということは,iPhone2.0で開発する場合は,assign属性でプロパティを設定して,deallocメソッドでreleaseするという従来通りの方法でやるということか.