從事iOS開發(fā)有些年頭了發(fā)現(xiàn)有些基礎(chǔ)的東西還是會因為時間久遠(yuǎn)而不記得一些細(xì)節(jié),現(xiàn)在開始慢慢整理一些東西來幫助思考.
簡單摘要
assign
:簡單賦值舍悯,不會更改索引計數(shù)
retain
: 釋放舊的對象肥荔,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數(shù)為1
copy
: 會建立一個索引計數(shù)為1的對象速种,然后釋放舊對象
readonly
:表示這個屬性是只讀的,就是只生成getter方法脯颜,不會生成setter方法
readwrite
:屬性為可讀寫
nonatomic
:非原子性訪問哟旗,不加同步
@synthesize
、:編譯器自動實現(xiàn)getter/setter方法
@dynamic
:手動實現(xiàn)getter/setter方法
@property
:
copy, retain, assign區(qū)別
retain:釋放舊的對象栋操,將舊對象的值賦予輸入對象闸餐,再提高輸入對象的索引計數(shù)為1
assign: 簡單賦值,不更改索引計數(shù)(Reference Counting)
copy: 建立一個索引計數(shù)為1的對象矾芙,然后釋放舊對象
* 使用assign: 對基礎(chǔ)數(shù)據(jù)類型 (NSInteger)和C數(shù)據(jù)類型(int, float, double, char,等)
* 使用copy: 對NSString
* 使用retain: 對其他NSObject和其子類
copy的使用舉例
@property(nonatomic舍沙,copy)NSString * str;
在setter方法中
- (void)setStr:(NSString *)str{
if(_str != str){ //判斷是否需要重新賦值
[_str release]; //釋放舊引用剔宪,計數(shù)器-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 區(qū)別
@synthesize 如果沒有手動實現(xiàn)setter方法和getter方法,那么編譯器會自動加上這兩個方法
@dynamic 告訴編譯器屬性的setter與getter方法由用戶自己實現(xiàn)地淀,不自動生成失球。(對于readonly的屬性只需提供 getter方法即可)