從事iOS開發有些年頭了發現有些基礎的東西還是會因為時間久遠而不記得一些細節,現在開始慢慢整理一些東西來幫助思考.
簡單摘要
assign
:簡單賦值,不會更改索引計數
retain
: 釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
copy
: 會建立一個索引計數為1的對象,然后釋放舊對象
readonly
:表示這個屬性是只讀的,就是只生成getter方法,不會生成setter方法
readwrite
:屬性為可讀寫
nonatomic
:非原子性訪問,不加同步
@synthesize
、:編譯器自動實現getter/setter方法
@dynamic
:手動實現getter/setter方法
@property
:
copy, retain, assign區別
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
assign: 簡單賦值,不更改索引計數(Reference Counting)
copy: 建立一個索引計數為1的對象,然后釋放舊對象
* 使用assign: 對基礎數據類型 (NSInteger)和C數據類型(int, float, double, char,等)
* 使用copy: 對NSString
* 使用retain: 對其他NSObject和其子類
copy的使用舉例
@property(nonatomic,copy)NSString * str;
在setter方法中
- (void)setStr:(NSString *)str{
if(_str != str){ //判斷是否需要重新賦值
[_str release]; //釋放舊引用,計數器-1
_str = [str copy]; //重新賦值,使用copy }
}
- (void)test{
NSMutableSting *s = [[NSMutableSting alloc] setString:@"hello"];
p.str = s; //此時,str的值為@"hello"
[s appendString:@"world"]; //此時,s的值為"hello world",但是str的值依然為"hello".
}
@dynamic @synthesize 區別
@synthesize 如果沒有手動實現setter方法和getter方法,那么編譯器會自動加上這兩個方法
@dynamic 告訴編譯器屬性的setter與getter方法由用戶自己實現,不自動生成。(對于readonly的屬性只需提供 getter方法即可)