2021-01-14 OC中的property 和synthesize

@property有两个对应的词,一个是@synthesize,一个是@dynamic

1、都不写

如果@synthesize@dynamic都没写,那么默认的就是@syntheszie var = _var;

2、synthesize

@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。并且创建实例变量,这两个方法与这个实例变量是对应到的,创建的实例变量的名字与这个赋值的名字是相同的。

property在类中自动生成@syntheszie var = _var;默认不写syntheszie
property就是依赖@synthesize 生成setter和getter方法的.
property是定义属性,也是依赖 @synthesize创建变量的; 如果属性名字指定别的变量名,如果变量存在,则不会创建变量,否则创建对应名字的变量

分类中不会自动合成属性,匿名分类 ( 扩展)中可以自动合成属性

3、dynamic

@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,
但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;
或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。

若对于一个属性使用了@dynamic var = _var,则编译器立马报错。这样你就无法像@synthesize那样在var的setter方法和getter方法中使用_var,当然你更不能编写如下的setter方法和getter方法

@dynamic最常用的使用是在NSManagedObject中,此时不需要显示编程setter和getter方法。原因是:@dynamic告诉编译器不做处理,使编译通过,其getter和setter方法会在运行时动态创建,由Core Data框架为此类属性生成存取方法。

property在分类中xcode报警告,建议手写@dynamic var; 并且提供setter和getter方法

4,synthesize和dynamic

@synthesize,@dynamic 必须要提前声明, 否则编译报错,并且没有集成协议
类的interface中或者 类扩展的interface中 使用property, 才可以synthesize和dynamic, 报错如下

Property implementation must have its declaration in interface 'Synthesize' or one of its extensions

5, demo代码

@protocol SynthesizeProtocol
@property(nonatomic,strong)NSString *i;
@end

@interface Synthesize : NSObject<SynthesizeProtocol> {
    @private
    NSString*f;
}

@property (strong, nonatomic) NSString *a;
@property (strong, nonatomic) NSString *b;
@property (strong, nonatomic) NSString *c;
@property (strong, nonatomic) NSString *d;
@property (strong, nonatomic) NSString *e;
@property (strong, nonatomic) NSString *f;
-(void)func1;
@end

@implementation Synthesize{
    NSString*_ccc;
    //proxyerObj*_eeeObj;
}



@synthesize a;          //setA,a, 创建实例变量a, 如果不指定名字, 变量名与属性名字相同


//@synthesize b=_b;    //默认的 会自动创建。setB,b,对应到ivar为_b上,创建实例变量_b

@synthesize c=_ccc;      //setC,c, setter/getter方法对应实例变量为_ccc上,不会再创建新的实例变量

@synthesize  d=_dddd;   //setD,d,创建实例变量_dddd


////不会创建实例变量, 也不会有setter,getter,需要自己实现。但是编译器提供setter,getter可访问。
@dynamic e;

@dynamic f;     //会覆盖,不会自动@synthesize f=_f;所以不会创建实例变量_f,不会创建setF,f方法

 
-(void)func1 {
    
    
    a=@"asdfa";
    //Use of undeclared identifier '_a'
    //_a=@"123412341";
    
    
    _b=@"asdfasd";
    //Use of undeclared identifier 'b'
    //b=@"asdfasdafsdf";
    
    
    //Use of undeclared identifier 'c'
    //c=@"asdfasd";
    //Use of undeclared identifier '_c'
    //_c=@"asdfasdfas";
    _ccc=@"asdfasdads";
    
    
    _dddd=@"asdfasdfasdf";
    
    [self setF:@"asdfa"];
    NSLog(@"%@",  [self f]);
    
    self.i=@"123";
    [self setI:@"123412"];
    //Use of undeclared identifier '_i'
    //_i=@"12431314";
    
    // 会崩溃
    //Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Synthesize setE:]: unrecognized selector sent to instance 0x6000002d8b10'
    //    [self setE:@"9999991"];
    //    NSLog(@"%@",  [self e]);
}

-(void)setF:(NSString *)ftomp{
    f=ftomp;
}


-(NSString *)f{
    return f;
}

运行结果

对象  <Synthesize: 0x600001410f40>,  类对象  Synthesize
           实例方法: [
  "- (void)func1",
  "- (void)setF:(id)arg0 ",
  "- (id)f",
  "- (void).cxx_destruct",
  "- (void)setC:(id)arg0 ",
  "- (id)c",
  "- (void)setA:(id)arg0 ",
  "- (void)setB:(id)arg0 ",
  "- (id)a",
  "- (id)b",
  "- (void)setI:(id)arg0 ",
  "- (id)i",
  "- (void)setD:(id)arg0 ",
  "- (id)d"
]
            实例变量:  [
  "NSString* f",
  "NSString* _ccc",
  "NSString* a",
  "NSString* _dddd",
  "NSString* i",
  "NSString* _b"
]
           属性: [
  "@property (nonatomic, strong) NSString* a",
  "@property (nonatomic, strong) NSString* b",
  "@property (nonatomic, strong) NSString* c",
  "@property (nonatomic, strong) NSString* d",
  "@property (nonatomic, strong) NSString* e",
  "@property (nonatomic, strong) NSString* f",
  "@property (nonatomic, strong) NSString* i"
]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351