@property
本質(zhì) = ivar (實(shí)例變量) + getter (取方法) + setter (存方法)
“屬性”(property)有兩大概念:實(shí)例變量(ivar)、存取方法(getter + setter)
@synthesize
編譯器期間,讓編譯器自動生成getter/setter方法。
當(dāng)有自定義的存或取方法時(shí),自定義會屏蔽自動生成該方法
@dynamic
告訴編譯器,不自動生成getter/setter方法,避免編譯期間產(chǎn)生警告
然后由自己實(shí)現(xiàn)存取方法或存取方法在運(yùn)行時(shí)動態(tài)創(chuàng)建綁定
注意:
在xcode4.4(ios6)之后,系統(tǒng)會自動讓編譯器生產(chǎn)getter和setter方法,無需手動添加@synthesize
屬性修飾符
assign:
簡單賦值,不更改引用計(jì)數(shù)。一般用于基礎(chǔ)類型的數(shù)據(jù)(NSInteger)其在MRC下是默認(rèn)值。
copy:會拷貝傳入的對象(即創(chuàng)建一個引用計(jì)數(shù)為1的新對象,但是內(nèi)容與傳入對象相同)并把型的對象賦值給實(shí)例變量。常用與NSString,Block
retain:
釋放舊對象,并使傳入的新對象引用計(jì)數(shù)+1。此屬性只能用于NSObject及其子類,而不能用于CoreFoundation。
strong:
強(qiáng)引用,類似于retain。要求保留傳入的對象,并放棄原有對象。一個對象只要被至少一個強(qiáng)引用指向,則其不會被釋放,而當(dāng)沒有強(qiáng)引用指向時(shí)則會被釋放。其在ARC下是對象類型的默認(rèn)值。
weak:
弱引用,要求不保留傳入的屬性(既不會使傳入的對象引用計(jì)數(shù)+1)。類似于assign,但與assign不同的是,當(dāng)它們指向的對象被釋放后,weak會被自動置為nil,而assign則不會,所以assign會導(dǎo)致“野指針”的出現(xiàn),weak可以避免懸空指針。
unsafe_unretained:
其實(shí)質(zhì)等同于assign。與weak的區(qū)別就是指向的對象如果被釋放,其不會被置為nil,而導(dǎo)致懸空指針的出現(xiàn)。它是ARC模式下非對象屬性的默認(rèn)值。