第1回 @property,@synthesize,retain,assign,copyについて | 渋谷で働くUnity野郎

渋谷で働くUnity野郎

備忘録として有効活用していきます。

10月11日に書いた記事を再び編集します。
まとめるとか言いながら半月くらい遅くなって、K君ごめんなさい。
でも、あの時から結構時間が経ってるから、忘却曲線的に、逆に丁度いいよね…?

さて、Objective-Cあるあるですが。


@property?

@synthesize?

copyにassignにretain?

更に…_weak? _strong?

なんじゃらほい。


とりあえずはグーグル先生に聞きます。

→なんとなく分かりづらい。

→まぁ、そこまで影響ないし、いいかー。


今回はそれを自分なりに解消してみます。
(自分なり、なので、もしかしたら語弊があるかもしれませんがご了承下さい。)

この辺の知識をつけてハッピーになりましょう。

少し長くなるので3回に分けて説明します。

まずは前提知識。

@property,@synthesize宣言は次のように記述する。

.hファイルにて
@property(属性,属性,....) 変数;
※属性には、retain , copy , assign , _weak , _strong などが入ります。

.mファイルにて
@synthesize 変数;

以上、前提知識終わり!
本題に入ります。



(1)「@property , @synthesize」って何?

端的にいいましょう。

@propertyによって宣言し、@synthesizeした変数には自動的アクセッサメソッドが実装されます。

アクセッサメソッドとは何?
アクセッサメソッドは「セッター」と「ゲッター」の2つです。
この2つのメソッドを実装する事で、違うクラスから値をいじれます。
「public変数にせずに、他のクラスから値をいじる」(カプセル化)、というオブジェクト指向の基本ですね。

簡単な例を示せば、Aクラス,Bクラスがあるとします。

Aクラス
A{
int x
//セッター
void set_x(int hikisuu){
x = hikisuu;
}

//ゲッター
int get_x(){
return x;
}
}

Bクラス
main(){
【Javaなら】
A instance = new A();
instance.set_x(30);
System.out.println( instance.get_x() ); 
(Javaの場合、instance.x = 30;)のように「 . 」でアクセスできます。


【ObjectiveCなら】
A *instance = [[A alloc] init];)
[instance set_x:30];
NSLog(@"%d", [instance get_x]);
}

このように他のクラスから値をいじる為のメソッドをセッター、ゲッターといい、これら2つを合わせてアクセッサメソッド(アクセスするためのメソッド)といいます。
このようなめんどくさい記述をしなくていいので、property宣言する事で、コードの可読性が上がります。

(1)まとめ
Objective-Cでは@property,@synthesizeの宣言によって、アクセッサメソッドをコンパイル時に自動的に作成してくれるので、わざわざ書く手間が省ける

また、この宣言をする事によって、Javaのような「 . によるアクセス」ができるようになります。

第2回 retain,assign,copyについて

第3回 weak,strongについて