頭と尻尾はくれてやる!

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


@synthesizeの後にイコールなんとかって何?

人様のコードを見るというのはホント勉強になりますね。

Study CoreData 0 序章 ~日本語で覚えなくっても良いじゃんね~ « Everything was born from Love
↑今はこのシリーズで CoreDataってものがどんなのか見てたりします。

ところが、 CoreData以前に基本的なところで躓いててなかなか進みません、、、
そんなところをメモしておきます。

出てくるサンプルコードでよくわからなかったのが、
@synthesize fetchedResultsController=fetchedResultsController_;
というように@synthesizeのプロパティ名の後に、イコールごにょごにょって続く形。

なんだこりゃ?
ってことで調べてみたところ、こんな記事が。↓
【コラム】ダイナミックObjective-C (102) プロパティ(2) - プロパティの宣言 | エンタープライズ | マイコミジャーナル
プロパティ名の後に、インスタンス変数名を指定してやればいい。これで、プロパティを任意のインスタンス変数と関連づけることができる。

フーン、、、
とりあえず、試してみた。
Personクラスってベタなクラスを作りました。
ヘッダー部分(Person.h)はこんな感じ。
@interface Person : NSObject {
    NSString *_myName;
}
@property(nonatomic, retain) NSString *myName;
-(void)sayHello;
@end
プロパティにmyName、文字列型のインスタンス変数名に_myName、 sayHelloってメソッドを持ちますよってことで。

実装部分(Person.m)はこんな感じ。
@implementation Person

@synthesize myName;//(1)
//@synthesize myName = _myName;//(2)

-(void)sayHello{
    NSLog(@"Hello, I'm %@! (_myName)",_myName);
    NSLog(@"Hello, I'm %@! (self.myName)",self.myName);
}
@end
synthesizeでプロパティ名のみを(1)、プロパティ名の後にイコールとインスタンス名を記述したのが(2)としますね。

これを使うクラスに以下のように記述します。
Person *he = [[Person alloc] init];//初期化
[he sayHello];//メソッド実行
he.myName = @"Taro";//ここで"Taro"をセットする
NSLog(@"--- set Taro ---");
[he sayHello];//もう一度メソッド実行
実行結果の比較がこれ↓

実行結果

↑上部が(1)で下部が(2)です。
ほれ、(2)だとプロパティ"myName"をTaroとセットしたのに、 Personクラス内部のインスタンス(_myName)も、Taroを指している!!!
こういうことかっ!

ちなみに、逆にPersonクラス内部で_myNameをたとえば"Jiro"に変更しても、それを使う側からプロパティ(myName)へアクセスするとちゃんと"Jiro"になるんですよ!

ほー!
機能はわかった。
ただ、この@synthesizeでプロパティとインスタンス変数を関連づける技(?)が何に役立つのかまだピンと来ませんが、とりあえず覚えておこうっと。

<< プロパティをこんな風に設定できるとは知らなかったが、、、  TopPage  プロパティなのにリファレンスのメソッドを探してしまう >>

コメント


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

トラックバック

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




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

FC2Ad