當(dāng)使用@PRoperty定義property時,還可在@property和類型之間用括號添加一些額外的提示符,可使用的特殊指示符如下
· assign:該指示符指定對屬性只是進(jìn)行簡單賦值,不更改對所賦的值的引用計數(shù)。這個指示符主要適用于NSInteger等基礎(chǔ)類型,以及short、float、double、結(jié)構(gòu)體等各種C數(shù)據(jù)類型。
提示:引用計數(shù)是Objective-C內(nèi)存回收的概念,當(dāng)一個對象的引用計數(shù)大于0時,表明該對象還不應(yīng)該被回收,由于NSInteger等基礎(chǔ)類型,以及short、float、double、結(jié)構(gòu)體等各種C數(shù)據(jù)類型都不存在回收的問題,因此使用assign即可。
· atomic(nonatomic):指定合成的存取方法是否為原子操作。所謂原子操作,主要指是否線程安全。如果使用atomic,那么合成的存、取方法都是線程安全的——當(dāng)一個線程進(jìn)入存、取方法的方法體之后,其他線程無法進(jìn)入該存、取方法,這樣就可以避免多線程并發(fā)破壞對象數(shù)據(jù)完整性,atomic是默認(rèn)值。雖然atomic可以保證對象數(shù)據(jù)的完整性,但atomic的線程安全會造成性能下降,因此,大多數(shù)單線程環(huán)境下,我們都會考慮使用nonatomic來提高存取方法的訪問性能。
· copy:如果使用copy指示符,當(dāng)調(diào)用setter方法對成員變量賦值時,會將被賦值的對象復(fù)制一份副本,再將該副本賦值給成員變量。copy指示符會將原成員變量所引用對象的引用計數(shù)減1。當(dāng)成員變量的類型是可變類型,或其子類是可變類型時,被賦值的對象有可能在賦值之后被修改,如果程序不需要這種修改影響setter方法設(shè)置的成員變量的值,此時就可考慮使用copy指示符。
· getter、setter:這兩個指示符用于為合成的getter方法、setter方法指定自定義方法名。例如,getter=abc指定getter方法的方法名為abc;setter=xyz: (因此setter方法要帶參數(shù),不要忘記了冒號),則指定setter方法的方法名為xyz:。
· readonly、readwrite:readonly指示系統(tǒng)只合成getter方法,不再合成setter方法;readwrites是默認(rèn)值,指示系統(tǒng)需要合成setter、getter方法。
· retain:使用retain指示符定義屬性時,當(dāng)把某個屬性賦值給該屬性時,該屬性原來所引用的對象的引用計數(shù)減1,被賦值對象的引用計數(shù)加1。
提示:在未啟用ARC機(jī)制的情況下,retain是一個很有用的指示符:當(dāng)一個對象的引用計數(shù)大于1時,該對象不應(yīng)該被回收,但啟用ARC機(jī)制之后,一般較少使用retain指示符。
· strong、weak:strong指示符指定該屬性對被賦值對象持有強(qiáng)引用,而weak指示符指定該屬性對被賦值對象持有弱引用。強(qiáng)引用的意思是:只要該強(qiáng)引用指 向被賦值的對象,那么該對象就不會自動回收;弱引用的意思是:即使該弱引用指向被賦值的對象,該對象也可能被回收。
提示:在啟動ARC機(jī)制時,使用strong、weak指示符將十分方便。如果程序不希望被該屬性引用的對象被回收,那就應(yīng)該使用strong指示符;如果程序需要保證性能,避免內(nèi)存溢出,則可以使用weak指示符。使用weak指示符時需要小心,當(dāng)程序通過該weak屬性來訪問被引用的對象時,該對象可能已經(jīng)被回收了。對于聲明為weak的指針,指針指向的地址一旦被釋放,這些指針都將被賦值為nil。這樣能有效地防止懸空指針。weak指示符可有效地幫我們防止懸空指針。
· unsafe_unretained:這個指示符與weak指示符基本相似,對于只被unsafe_unretained指針?biāo)赶虻膶ο螅搶ο笠部赡鼙换厥?。與weak指針不同的是,當(dāng)unsafe_unretained指針?biāo)玫膶ο蟊换厥蘸?,unsafe_unretained指針不會被賦值為nil,因此這可能導(dǎo)致程序崩潰。一般來說,使用unsafe_unretained指示符不如使用weak指示符。
新聞熱點(diǎn)
疑難解答