2021-01-14 OC中的property 和synthesize

@property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是@synthesize,一個(gè)是@dynamic

1、都不寫

如果@synthesize@dynamic都沒(méi)寫,那么默認(rèn)的就是@syntheszie var = _var;

2、synthesize

@synthesize的語(yǔ)義是如果你沒(méi)有手動(dòng)實(shí)現(xiàn)setter方法和getter方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法。并且創(chuàng)建實(shí)例變量,這兩個(gè)方法與這個(gè)實(shí)例變量是對(duì)應(yīng)到的,創(chuàng)建的實(shí)例變量的名字與這個(gè)賦值的名字是相同的。

property在類中自動(dòng)生成@syntheszie var = _var;默認(rèn)不寫syntheszie
property就是依賴@synthesize 生成setter和getter方法的.
property是定義屬性,也是依賴 @synthesize創(chuàng)建變量的; 如果屬性名字指定別的變量名,如果變量存在,則不會(huì)創(chuàng)建變量,否則創(chuàng)建對(duì)應(yīng)名字的變量

分類中不會(huì)自動(dòng)合成屬性,匿名分類 ( 擴(kuò)展)中可以自動(dòng)合成屬性

3、dynamic

@dynamic告訴編譯器,屬性的setter與getter方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成。(當(dāng)然對(duì)于readonly的屬性只需提供getter即可)。假如一個(gè)屬性被聲明為@dynamic var,然后你沒(méi)有提供@setter方法和@getter方法,編譯的時(shí)候沒(méi)問(wèn)題,
但是當(dāng)程序運(yùn)行到instance.var =someVar,由于缺setter方法會(huì)導(dǎo)致程序崩潰;
或者當(dāng)運(yùn)行到 someVar = var時(shí),由于缺getter方法同樣會(huì)導(dǎo)致崩潰。編譯時(shí)沒(méi)問(wèn)題,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法,這就是所謂的動(dòng)態(tài)綁定。

若對(duì)于一個(gè)屬性使用了@dynamic var = _var,則編譯器立馬報(bào)錯(cuò)。這樣你就無(wú)法像@synthesize那樣在var的setter方法和getter方法中使用_var,當(dāng)然你更不能編寫如下的setter方法和getter方法

@dynamic最常用的使用是在NSManagedObject中,此時(shí)不需要顯示編程setter和getter方法。原因是:@dynamic告訴編譯器不做處理,使編譯通過(guò),其getter和setter方法會(huì)在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建,由Core Data框架為此類屬性生成存取方法。

property在分類中xcode報(bào)警告,建議手寫@dynamic var; 并且提供setter和getter方法

4,synthesize和dynamic

@synthesize,@dynamic 必須要提前聲明, 否則編譯報(bào)錯(cuò),并且沒(méi)有集成協(xié)議
類的interface中或者 類擴(kuò)展的interface中 使用property, 才可以synthesize和dynamic, 報(bào)錯(cuò)如下

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, 創(chuàng)建實(shí)例變量a, 如果不指定名字, 變量名與屬性名字相同


//@synthesize b=_b;    //默認(rèn)的 會(huì)自動(dòng)創(chuàng)建。setB,b,對(duì)應(yīng)到ivar為_(kāi)b上,創(chuàng)建實(shí)例變量_b

@synthesize c=_ccc;      //setC,c, setter/getter方法對(duì)應(yīng)實(shí)例變量為_(kāi)ccc上,不會(huì)再創(chuàng)建新的實(shí)例變量

@synthesize  d=_dddd;   //setD,d,創(chuàng)建實(shí)例變量_dddd


////不會(huì)創(chuàng)建實(shí)例變量, 也不會(huì)有setter,getter,需要自己實(shí)現(xiàn)。但是編譯器提供setter,getter可訪問(wèn)。
@dynamic e;

@dynamic f;     //會(huì)覆蓋,不會(huì)自動(dòng)@synthesize f=_f;所以不會(huì)創(chuàng)建實(shí)例變量_f,不會(huì)創(chuàng)建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";
    
    // 會(huì)崩潰
    //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;
}

運(yùn)行結(jié)果

對(duì)象  <Synthesize: 0x600001410f40>,  類對(duì)象  Synthesize
           實(shí)例方法: [
  "- (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"
]
            實(shí)例變量:  [
  "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"
]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容