クラス内のインスタンス変数をIB(や他のクラス)で利用する場合、IBより値が参照できるようにアクセサ(putter, getter)を各クラスで実装しておく必要がある。しかし@propertyを記述することで、実際のアクセサを実装しなくても値の参照が可能となる。
#import <UIKit/UIKit.h> @interface DigitalClock1ViewController : UIViewController { // インスタンス変数の宣言 UILabel *label; } @property(weak, nonatmic) IBOutlet UILabel *label; @property(strong, nonatmic) NSString *str; @end
@propertyのあとの属性はいくつでも指定できる。
属性 | 挙動 |
---|---|
nonatomic | スレッドセーフじゃないけど動作は早い? |
weak | 弱参照。参照先のObjectは、強参照しているObjectが無くなると消滅する |
strong | 強参照。強参照している間は、対象先のObjectは消滅しない |
Storyboad上のObjectはViewController自身が間接的に強参照している、したがってIBOutletで再度ダイレクトに強参照する必要は無い。ただしViewControllerが管轄していないObjectに関しては、Storyboad上にあったとしても強参照しなければならない場合がある。Storyboad以外のObjectを参照する場合も同様に強参照すべきかどうか検討する必要がある。
@synthesize label;
最後に@implementationに@synthesizeを記入することで、getメソッドとputメソッドが自動的に実装される
self.str = nil; [self setLabel:nil];
viewUnloadedメソッドで各Objectの解放を行う