今回、参考にしたSQLiteBooksのAppDelegate.hに限らず、Appleのサンプルソースは基本@property使い倒しなんで、一度、ちゃんと調べないといかんすね。
とかな。
関係ないけど
なんてせずに
としてるのは「iPhoneアプリ開発、その(40)」でも書いたように依存度を減らすためです。ちゃんとAppleのサンプルもやってますな。
で、本題。
てのは「Objective-C 2.0プログラミング言語」の「プロパティの使用」で説明されてるとおり。
に対してのアクセッサ(設定、所得メソッド)
を宣言することと同じことだそうです。
でもって実装ファイルAppDelegate.mの@implementation側で
とやることで
を実装したことと同じになるんだとか。
で、setBooksで「おいっ!」て思った人。そーです。これじゃbooksが自分が持ってる間中は存在するということが保証されません。
「iPhoneアプリ開発、その(33)」を読んでる人は、当然そこはretainでしょう。となるわけですが...
やっぱり@propertyでも
の登場なわけです。これで、代入時にオブジェクトに対してretainを呼び出す必要があることを指定するので
といった実装に変わるみたいです。ただしreleaseまでは面倒見てくれないのでdeallocメソッドで
てしてるわけですな。
残りのnonatomicはちょっとややこしい。
「Objective-C 2.0プログラミング言語」ではマネージドメモリ環境とガベージコレクト環境(ちなみに、ここでの環境はメモリ管理環境を指す)で扱いが違うって書いてます。
nonatomicを指定しないと、マネージドメモリ環境ではオブジェクトプロパティの合成されたgetアクセサは、返された値の保持と自動解放を行います。
とか書いてる。う~ん
てことですかね~?
ならまったく意味なしですが、まあ、ちょっと意味があるかも。nonatomic指定は、そういう保証をしなくていいよ、そのまま
ってやっちゃって~、という指定なのかな。あとスレッドも絡むみたいだけど、深くは追求しません。
Bookの方のヘッダーファイルはというと
なぜにintじゃなくNSInteger?
謎。
そのためにわざわざassignを記述しなくちゃならなくなってるし(本来assignは書かなくてもデフォルトなんだけど、NSCopyingプロトコルを採用してる変数つまりNSObject継承クラスは、これをやらないとコンパイラ警告が発生するみたい)。まあいいけど....
readonlyはアクセッサの設定側メソッドを作らせない指定。
title、copyright、authorについては自分が保有してるってことでcopy指定をしてるみたい。retainでもいいとは思うけど、まあ、こっちの方が独立性あるし、いいのではてとこですな。titleを例にするなら
こんな感じか?
以上、propertyをちょっと調べてみた~、でした。
@property (nonatomic, retain) NSMutableArray *books;
とかな。
関係ないけど
#import "Book.h"
#import "MasterViewController.h"
なんてせずに
@class Book, MasterViewController, ...
としてるのは「iPhoneアプリ開発、その(40)」でも書いたように依存度を減らすためです。ちゃんとAppleのサンプルもやってますな。
で、本題。
@property (nonatomic, retain) NSMutableArray *books;
てのは「Objective-C 2.0プログラミング言語」の「プロパティの使用」で説明されてるとおり。
NSMutableArray *books;
に対してのアクセッサ(設定、所得メソッド)
- (NSMutableArray *)books;
- (void)setBooks:(NSMutableArray *)newBooks;
を宣言することと同じことだそうです。
でもって実装ファイルAppDelegate.mの@implementation側で
@synthesize books;
とやることで
- (NSMutableArray *)books {
return books;
}
- (void)setBooks:(NSMutableArray *)newBooks {
books = newBooks;
}
を実装したことと同じになるんだとか。
で、setBooksで「おいっ!」て思った人。そーです。これじゃbooksが自分が持ってる間中は存在するということが保証されません。
「iPhoneアプリ開発、その(33)」を読んでる人は、当然そこはretainでしょう。となるわけですが...
やっぱり@propertyでも
retain
の登場なわけです。これで、代入時にオブジェクトに対してretainを呼び出す必要があることを指定するので
- (void)setBooks:(NSMutableArray *)newBooks {
if (books != newBooks) {
[books release];
books = [newBooks retain];
}
}
といった実装に変わるみたいです。ただしreleaseまでは面倒見てくれないのでdeallocメソッドで
[books release];
てしてるわけですな。
残りのnonatomicはちょっとややこしい。
「Objective-C 2.0プログラミング言語」ではマネージドメモリ環境とガベージコレクト環境(ちなみに、ここでの環境はメモリ管理環境を指す)で扱いが違うって書いてます。
nonatomicを指定しないと、マネージドメモリ環境ではオブジェクトプロパティの合成されたgetアクセサは、返された値の保持と自動解放を行います。
とか書いてる。う~ん
- (NSMutableArray *)books {
return [[books retain] autorelease];
}
てことですかね~?
return [[books retain] release];
ならまったく意味なしですが、まあ、ちょっと意味があるかも。nonatomic指定は、そういう保証をしなくていいよ、そのまま
return books;
ってやっちゃって~、という指定なのかな。あとスレッドも絡むみたいだけど、深くは追求しません。
Bookの方のヘッダーファイルはというと
@property (assign, nonatomic, readonly) NSInteger primaryKey;
なぜにintじゃなくNSInteger?
謎。
そのためにわざわざassignを記述しなくちゃならなくなってるし(本来assignは書かなくてもデフォルトなんだけど、NSCopyingプロトコルを採用してる変数つまりNSObject継承クラスは、これをやらないとコンパイラ警告が発生するみたい)。まあいいけど....
readonlyはアクセッサの設定側メソッドを作らせない指定。
@property (copy, nonatomic) NSString *title;
@property (copy, nonatomic) NSDate *copyright;
@property (copy, nonatomic) NSString *author;
title、copyright、authorについては自分が保有してるってことでcopy指定をしてるみたい。retainでもいいとは思うけど、まあ、こっちの方が独立性あるし、いいのではてとこですな。titleを例にするなら
-(void)setTitle:(NSString *)newTitle {
if (title != newTitle) {
[title release];
title = [newTitle copy];
}
}
こんな感じか?
以上、propertyをちょっと調べてみた~、でした。