在很久很久以前iOS是木有@property滴羽莺,我們必須自己定義實例變量和存取方法
@interface User : NSObject
{
NSString *name ;
NSInteger age;
}
@end
#import "User.h"
@interface User()
@end
@implementation User
-(void)setName:(NSString *)_name{
self->name = [_name copy];
}
-(NSString *)getName{
return self->name;
}
@end
屬性@property給我們帶來了什么?
@property = ivar + getter + setter; PS : 實例變量 = 成員變量 = ivar
@property 會根據(jù)(特質(zhì))的類型自定義合成不同的存取方法,這個過程由編譯 器在編譯期執(zhí)行浓恳。
編譯器還要自動向類中添加適當類型的實例變量,并且在屬性名前面加下劃線,以此作為實例變量的名字
屬性可以擁有的特質(zhì)分為四類:
原子性---nonatomic
讀/寫權限---readwrite(讀寫) readonly (只讀)
內(nèi)存管理語義---assign尖淘、strong、weak著觉、unsafe_unretained村生、copy
方法名---getter=<name>、setter=<name>
@property (nonatomic, getter=isOn) BOOL on;
@synthesize
@synthesize 根據(jù)(特質(zhì))去添加存取方法 饼丘!
(如果沒有指定@synthesize 趁桃, 會為屬性自動添加 @synthesize propertyName = _propertyName)
_propertyName就是實例變量的名稱,propertyName是屬性名稱肄鸽。
意味著使用屬性可以通過存取方法去訪問_propertyName實例變量卫病。
直接訪問實例變量不會調(diào)用屬性的存取方法
@dynamic不會為屬性自動創(chuàng)立合成方法,也不會自動添加屬性典徘。
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic,copy) NSString *subName;
@property (nonatomic,copy) NSString *name;
@end
#import "User.h"
@interface User()
@end
@implementation User
@synthesize subName = _subName;
@dynamic name ;
-(void)setName:(NSString *)name{
self.subName = [_subName stringByAppendingString:name];
}
@end
@dynamic 就是要告訴編譯器蟀苛,代碼中用@dynamic修飾的屬性,其getter和setter方法會在程序運行的時候或者用其他方式動態(tài)綁定逮诲,以便讓編譯器通過編譯帜平。其主要的作用就是用在NSManagerObject對象的屬性聲明上,由于此類對象的屬性一般是從Core Data的屬性中生成的梅鹦,core data 框架會在程序運行的時候為此類屬性生成getter和setter方法裆甩。
總結(jié)一下:
當你想手動管理 @property 的所有內(nèi)容時,你就會嘗試通過實現(xiàn) @property 的所有“存取方法”(the accessor methods)或者使用 @dynamic 來達到這個目的齐唆,這時編譯器就會認為你打算手動管理 @property嗤栓,于是編譯器就禁用了 autosynthesis(自動合成)。
因為有了 autosynthesis(自動合成)蝶念,大部分開發(fā)者已經(jīng)習慣不去手動定義ivar抛腕,而是依賴于 autosynthesis(自動合成)芋绸,但是一旦你需要使用ivar,而 autosynthesis(自動合成)又失效了担敌,如果不去手動定義ivar摔敛,那么你就得借助 @synthesize 來手動合成 ivar。
當你同時重寫了 setter 和 getter 時全封,系統(tǒng)就不會生成 ivar(實例變量/成員變量)马昙。這時候有兩種選擇:
手動創(chuàng)建 ivar 或者使用@synthesize ; 關聯(lián) @property 與 ivar。
PS : effective Objective-C建議我們在對象內(nèi)部盡量直接訪問實例變量而不是用存取方法刹悴。