1、@property 后面可以有哪些修飾符挫望?
可以簡單總結為以下幾類:
?控制set方法的內存管理
retain:release舊值立润,retain新值(用于OC對象)
assign:直接賦值,不做任何內存管理(默認媳板,用于非OC對象類型)
copy:release舊值桑腮,copy新值(一般用于NSString*)
?控制需不需生成set方法
readwrite:同時生成set方法和get方法(默認)
readonly:只會生成get方法
?多線程管理
atomic:性能低(默認)
nonatomic:性能高(最常用)
?控制set方法和get方法的名稱
setter:設置set方法的名稱,一定有個冒號:
getter:設置get方法的名稱
2蛉幸、什么情況使用 weak 關鍵字破讨,相比 assign 有什么不同?
weak:(ARC下的)和(MRC)assign一樣奕纫,weak當指向的內存釋放掉后自動nil化提陶,防止野指針
weak適用于OC對象,修飾的成員變量為弱指針類型匹层;而assign適用于非OC對象類型
怎么用 copy 關鍵字搁骑?
copy 表示賦值特性,第一是setter方法將傳入對象復制一份又固;第二是需要完全一份新的變量時仲器。
3、這個寫法會出什么問題:@property (copy) NSMutableArray *array;
程序會崩潰仰冠,報錯:Attempt to mutate immutable object with xxx
使用copy屬性乏冀,在賦值時,會默認做一次copy操作洋只,會變成“不可變的類型”辆沦,
如果對于"可變類型"的屬性,使用copy描述符定義后识虚,那么賦值后肢扯,就是不可變的了!担锤,如果我們在程序中嘗試修改這個對象蔚晨,就會出現(xiàn)錯誤。
4肛循、如何讓自己的類用 copy 修飾符铭腕?如何重寫帶 copy 關鍵字的 setter?
1>假設我們有兩個類多糠,Person類和Student類累舷,那么在他們的.m文件里就可以這樣寫:
/**
自定義對象要實現(xiàn)copy功能
1> 遵守NSCopying協(xié)議
2> 實現(xiàn)- (id)copyWithZone:(NSZone *)zone
*/
@implementation Person
// 所有的copy方法,最終都會調用copyWithZone
// copy操作將一個對象夹孔,復制(當前對象的屬性)給一個新的對象
- (id)copyWithZone:(NSZone *)zone
{
// 1> 實例化對象被盈,self 是對象
// self.class能夠保證繼承的子類同樣使用copy方法
Person *p = [[self.class alloc] init];
// 2> 給屬性賦值
p.name = self.name;
p.age = self.age;
// 3> 返回新對象
return p;
}
如果父類遵守實現(xiàn)了這個協(xié)議析孽,那么子類就不需要在遵守了,可以寫成這樣:
- (id)copyWithZone:(NSZone *)zone
{
// 直接調用父類的copy方法
Student *s = [super copyWithZone:zone];
// 賦值只怎,只需要給子類的屬性賦值即可袜瞬!
s.no = self.no;
// 返回
return s;
}
2>重寫帶 copy 關鍵字的 setter
非ARC寫法:
@implementation Person
- (void)setName:(NSString *)name
{
? ?if (_name != name) {
? ? ? ? [_name release];
? ? ? ?_name = [name copy];
? ? }
}
- (void)dealloc
{
? ? [_name release];
? ?_name = nil;
? ? self.name = nil;
? ? [super dealloc];
}
@end
ARC寫法:
@implementation Person
- (void)setName:(NSString *)name
{
if (_name != name) {
_name = [name copy];
}
}
@end