@property有哪些屬性關鍵字?
readonly | 只讀 |
assign | 單純賦值(非對象類型使用) |
unsafe_unretained | 同assign一樣 用於ARC |
retain | 進行對象保持操作 |
strong | 同retain 用於ARC |
weak | 若引用 用於ARC |
copy | 複製對象 (生成副本進行賦值,但只適用於遵循NSCopying協議的對象) |
nonatomic | 非原子操作,非線程安全 |
atomic |
原子操作,主要是在getter和setter方法裏面加鎖 |
如何讓自己的類用copy修飾符?
1、需要聲明該類遵循NSCopying協議
2、實現NSCopying協議裏的方法,只有一個方法
- (instancetype)copyWithZone:(NSZone *)zone
{
XXModel *model = [[[self class] allocWithZone:zone] init];
model.name = self.name;
model.size = self.size;
model.objModelArray = [self.objModelArray mutableCopy];
// 有可能還需要進行深拷貝
return model;
}
如何重寫帶copy關鍵字的setter
- (void)setName:(NSString *)name
{
_name = [name copy];
}
@property的本質是什麼?
getter+setter
作用:封裝對象中的數據
編譯器會自動幫你生成一套存取的方法
ivar、getter,setter是如何生成並添加到這個類中的?
編譯器在編譯期間自動合成,當你完成屬性的定義後,編譯器會自動編寫訪問這個屬性所需要的方法。
這個過程除了生成getter、setter之外,編譯器還要自動爲類添加合適類型的實例變量(以_屬性名開頭,當然你可以用@synthesize name = _1name指定實例變量名)