* assign
設置方法只會執行針對“純量類型” 的簡單賦值操作,如CGFloat,NSInteger
* strong
此特質表明該屬性定義了一種“擁有關系”,為這種屬性設置新值時,設置方法會先保留新值,并釋放舊值,然后再將新值設置上去。
* copy
此特質所表達的所屬關系與strong類似。然而設置方法并不保留新值,而是將其‘拷貝’。當屬性類型是NSString *時,經常用此特d質來保護其封裝性,因為傳遞給設置方法的新值有可能指向一個NSMutableString類的實例,這個類是NSString的子類,表示一種可以修改其值的字符串,此時若是不拷貝字符串,那么設置完屬性之后,字符串的值就可能會在對象不知情的情況下遭人更改。所以,這時就要拷貝一份“不可變”的字符串,確保對象中的字符串值不會無意間變動。
只要實現屬性所用的對象是“可變的”,就應該在設置新屬性值時拷貝一份。
Objective-C默認聲明的一個對象就為__strong
在強引用中,有時會出現循環引用的情況,這時就需要弱引用來幫忙(__weak)。
強引用持有對象,弱引用不持有對象。
* weak和strong 用來修飾屬性如 @property (nonatomic, weak) NSString *name;
* __weak 和 __strong 用來修飾變量
weak 與assign 區別
##### @property (nonatomic, weak) id delegate;
##### @property (nonatomic, assign)id delegate;
*weak 和 assign* 是一種“非擁有關系”的指針,通過這兩種修飾符修飾的指針變量,都不會改變被引用對象的引用計數。但是在一個對象被釋放后,weak 會自動將指針指向 nil,而 assign 則不會。 在 iOS 中,向 nil 發送消息時不會崩潰的,但是 assign 就會導致野指針的錯誤 unrecoginzed selector sent to instance.
所以我們如果修飾代理屬性,還是用weak 修飾吧,比較安全。
typedef void (^selectedCell) (NSIndexPath * indedxpath);
##### *delegate 和 block 的選擇:*
1.多個消息傳遞,應該使用delegate
2.一個委托對象的代理屬性只能有一個代理對象
3.單例對象最好不要用delegate
單例對象由于始終都是同一個對象,如果使用delegate,就會造成我們上面說的delegate屬性被重新賦值的問題,最終只能有一個對象可以正常響應代理方法。
* ######代理更加面向過程,block則更面向結果。
比如網絡請求回來,通過success/failure 代碼塊來展示比較好
* ###### 從性能上說,block的性能消耗要略大于delegate,因為block會涉及到 棧區向堆區拷貝等操作,時間和空間上的消耗都大于代理。而代理只是定義了一個方法列表,在遵守協議對象的objc_protocol_list 中添加一個節點,在運行時向遵守協議的對象發送消息即可。