最近第一次接手了一個iOS的開發(fā)項目。通過這次項目對iOS開發(fā)中使用的Objective-C的語法有了一些初步認(rèn)識。
對于軟件開發(fā)來說定義Property是必不可少的俗他。Objective-C在定義Property的時候就有可以指定屬性來修飾Property。
整理了一下常用的大致有以下幾個。
- nonatomic
- strong
- weak
- assign
- copy
其中常用的組合:
// 通常聲明property的似乎佃牛,都是這3種組合
@property (nonatomic, strong) NSMutableArray *array;
@property (nonatomic, copy) NSString *iconName;
@property (nonatomic, assign) BOOL shouldRemind;
// 但是在聲明storybord的UI控件的Outlet時,也會用這種組合
@property (nonatomic, weak) IBOutlet UITextField *textField;
各種屬性的說明是這樣的医舆。
屬性 | 說明 |
---|---|
nonatomic | 非線性安全俘侠,與之相對應(yīng)的是atomic |
strong | 強(qiáng)引用,與之相對應(yīng)的是weak |
weak | 弱引用蔬将,與之相對應(yīng)的是strong |
assign | 簡單賦值 |
copy | 復(fù)制賦值 |
nonatomic很好理解爷速,iOS中和UI相關(guān)的通常指定非線程安全就可以了,不過nonatomic雖然很常用霞怀,但它不是默認(rèn)的屬性惫东,默認(rèn)的是atomic。
strong和weak是一對相對的屬性毙石,Xcode4還是5引入ARC(自動引用計數(shù))來管理內(nèi)存后廉沮,新添加的一對屬性。其中被strong修飾的property指向一個對象后徐矩,會觸發(fā)該對象的ARC自加滞时,同樣當(dāng)著這個property被設(shè)成nil后,該對象的ARC會自減滤灯;被weak修飾的property指向一個對象時坪稽,不會觸發(fā)該對象的ARC自加,相對的被設(shè)成nil后鳞骤,該對象的ARC也不會自減窒百,同樣當(dāng)該對象的ARC歸零后被會系統(tǒng)回收后,weak修飾的property也會自動被設(shè)成nil弟孟。
最后就是assign和copy其實還有一個retain贝咙,關(guān)于這組修飾用的屬性,涉及到property實現(xiàn)的拂募。
@interface NewClass ()
// 通常我們是向下下面一樣定義property
@property (nonatomic, copy) NSString *propertyName
@end
@implementation AllListsViewController {
NSString *_propertyNewName;
}
// 當(dāng)然我們也可以這么定義property
@synthesize propertyNewName = _propertyNewName;
// getter
- (NSString *) propertyNewName {
return _propertyNewName
}
// setter
- (void) setPropertyNewName:(NSString *)propertyNewName {
// 暫留
}
@end
而這3個修飾用的屬性的區(qū)別就在setter里面
- assgin就是指直接復(fù)制
- (void) setPropertyNewName:(NSString *)propertyNewName {
// assign是大概這個樣子的庭猩。
_propertyNewName = propertyNewName;
}
- copy則是先release陈症,然后再用參數(shù)的值copy了蔼水。
- (void) setPropertyNewName:(NSString *)propertyNewName {
// copy是大概這個樣子的。
[_propertyNewName release]录肯;
_propertyNewName = [propertyNewName copy];
}
- retain和copy很像趴腋。只不過是用參數(shù)值的retain函數(shù)
- (void) setPropertyNewName:(NSString *)propertyNewName {
// copy是大概這個樣子的。
[_propertyNewName release];
_propertyNewName = [propertyNewName retain];
}
以上就是幾個常用的來修飾property的屬性优炬,初次之外還有readonly和readwrite這兩個颁井,顧名思義這兩個屬性就是控制property的讀寫權(quán)限的。