@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"
]