@dynamic

1389 ワード

参照リンク


@dynamicと@synthesizeの違い
@propertyには@synthesizeと@dynamicの2つの対応する語があります.@synthesizeも@dynamicも書かれていない場合は、デフォルトは@syntheszie var=var;
@synthesizeの意味は、setterメソッドとgetterメソッドを手動で実装していない場合、コンパイラが自動的にこの2つのメソッドを追加することです.
@dynamicはコンパイラに,属性のsetterとgetterメソッドはユーザ自身が実現し,自動的に生成されないことを教える.(もちろんreadonlyのプロパティにはgetterを指定するだけです).属性が@dynamicvarとして宣言され、@setterメソッドと@getterメソッドが提供されていない場合は、コンパイル時に問題ありませんが、プログラムがinstanceに実行されます.var=someVar、setterメソッドが欠けているためプログラムがクラッシュします;あるいはsomeVar=varに実行すると、getterメソッドが欠けているためクラッシュすることもあります.コンパイル時に問題なく、実行時に対応するメソッドが実行されます.これがいわゆるダイナミックバインドです. readonly 。
パーソナルテストコード
@interface T1Model : NSObject

@property (nonatomic,copy,readonly) NSString *name;

@end


#import "T1Model.h"
#import 

@implementation T1Model
@dynamic name;  //  get set  

- (NSString *)name{
    NSString *str = objc_getAssociatedObject(self, @selector(name));
    if (str) {
        return  str;
    }
    
    BOOL offset = YES;
    
    //     
    if (offset) {
        objc_setAssociatedObject(self, @selector(name), @"", OBJC_ASSOCIATION_COPY);
    }
    
    return  objc_getAssociatedObject(self, @selector(name));
}

@end


- (void)viewDidLoad {
    [super viewDidLoad];
    T1Model *model = [T1Model new];
    NSString *name = model.name ;
    NSString *name1 = model.name ;
    
}