1.代理用nonatomic, weak修飾
weak:指明該對象并不負責保持delegate這個對象,delegate這個對象的銷毀由外部控制,會在dealloc方法中銷毀。
@property (nonatomic, weak) id <LWDelegate> delegate;
strong:該對象強引用delegate,外界不能銷毀delegate對象,會導致循環引用(Retain Cycles),不會在dealloc方法中銷毀,會導致內存泄漏。
@property (nonatomic, strong) id <LWDelegate> delegate;
2.block塊用nonatomic,copy
block屬性的聲明,首先需要用copy修飾符,因為只有copy后的block才會在堆中,棧中的block的生命周期是和棧綁定的,加了copy屬性后,當其所在棧被釋放的時候,這些本地變量將變得不可訪問,一旦代碼執行到block這段就會導致bad access。另一個需要注意的問題是關于線程安全,在聲明Block屬性時需要確認在調用Block時另一個線程有沒有可能去修改Block,如果確定不會有這種情況發生的話,那么block屬性聲明可以用nonatomic。
3.NSString對象一般用nonatomic,copy(因為字符串一般要遵循NSCopying協議)
我們在聲明NSString對象的時候,一般都是不希望外部來對他進行修改的,防止將NSMutableString賦值給NSString時,前者修改引起后者值變化而用的。
@property (nonatomic, copy) NSString *lwcopyStr;
@property (nonatomic, strong) NSString *lwstrongStr;
NSMutableString *lwmuStr = [NSMutableString stringWithString:@"LWW -- MutableString"];
self.lwcopyStr = lwmuStr;
self.lwstrongStr = lwmuStr;
[lwmuStr appendString:@"---copy"];
NSLog(@"lwmuStr %p lwcopyStr %p lwstrongStr %p", lwmuStr, self.lwcopyStr, self.lwstrongStr);
NSLog(@"%@ %@", self.lwcopyStr, self.lwstrongStr);
注意:在這里要用self.屬性,不能用下劃線屬性,因為下劃線是直接訪問屬性,沒有經過get方法,看不到效果。
4.BOOL、CGFloat、NSInteger、int等一般用nonatomic,assign
assign: 簡單賦值,不更改索引計數對基礎數據類型,例如NSInteger,CGFloat和C數據類型(int, float, double, char等。適用簡單數據類型。此標記說明設置器直接進行賦值,這也是默認值。
5.結構體,枚舉屬性一般用nonatomic,assign
因為在結構體里面的每個枚舉成員均具有相關聯的常數值,此值的類型就是包含了它的那個枚舉的基礎類型。每個枚舉成員的常數值必須在該枚舉的基礎類型的范圍之內,故枚舉跟上面的簡單數據類型一樣,都是用assign的,進行簡單賦值就行。每個枚舉值卻的的確確都有一個整數類型的數值相對應,而且可以轉換,只不過這種轉換必須用明晰的轉型語法來表達。
注意:枚舉不能被繼承
6.一般的屬性對象用nonatomic,strong
注意:如果是用XIB或者storyBoard拖的則是用weak,自己手動創建則是用strong。
iOS 5 中對屬性的設置新增了strong 和weak關鍵字來修飾屬性
strong 用來修飾強引用的屬性;
@property (strong) SomeClass * aObject;
對應原來的
@property (retain) SomeClass * aObject;
@property (copy) SomeClass * aObject;
weak 用來修飾弱引用的屬性;
@property (weak) SomeClass * aObject;
對應原來的
@property (assign) SomeClass * aObject;
慢慢來,一步一個巴掌印。。。。。