ARC下默認的基本類型
@property (atomic, readwrite, assign)
ARC下默認的對象類型
@property? (atomic, readwrite, strong)
1、原子性修飾符 atomic、nonatomic
atomic:線程安全?????????? nonatomic:非線程安全,使用該屬性性能會有所提高,一般都使用該屬性
2、讀寫屬性修飾符?? readwrite、readonly
readwrite:讀寫操作,系統(tǒng)默認設置getter和setter方法,可以修改
readonly:只讀操作,系統(tǒng)只是設置getter方法,只能獲取不能修改
3、setter相關修飾符?? assign、retain、copy
assign:表示直接賦值,用于基本的數(shù)據(jù)類型如:NSIntegar、CGFloat。C的數(shù)據(jù)類型如:float、int、char等。還有id類型
retain:針對對象類型進行內存管理,修飾對象,實現(xiàn)過程(setter方法會先將舊的屬性release掉,然后再對新的對象進行一次賦值,并進行一次retain)引用計數(shù)會加1
copy:主要修飾NSString類型,表示內容的復制
【當某對象的類具有可修改的子類時,應該將屬性設為copy。例如:NSString,NSArray,NSDictionary】
這樣做的原因是:如果屬性指向的對象的類具有可修改的子類,那個該屬性可能會指向可修改的子類對象,同時該子類對象可能會被其他擁有者修改。因此,最好先復制該對象,然后再將屬性指向復制后的對象。(編寫具有“防御性”的代碼)
關于@property后面修飾符的一些問題
1、@property (nonatomic,copy) NSMutableArray *array; 這段代碼會有什么問題?
添加,刪除,修改數(shù)組內的元素的時候,程序會因為找不到對應的方法(unrecognised selector)而崩潰.因為 copy 就是復制一個不可變 NSArray的對象。
應如何修改?
@property (nonatomic,MUtableCopy) NSMutableArray *array;
2、assign與weak,它們都是弱引用聲明類型,最大的區(qū)別在那呢?
如果用weak聲明的變量在棧中就會自動清空,賦值為nil。
如果用assign聲明的變量在棧中可能不會自動賦值為nil,就會造成野指針錯誤!
3、用@property聲明的NSString(或NSArray,NSDictionary)經常使用copy關鍵字,為什么?如果改用strong關鍵字,可能造成什么問題?
1).因為父類指針可以指向子類對象,使用 copy 的目的是為了讓本對象的屬性不受外界影響,使用 copy 無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本.
2).如果我們使用是 strong ,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性.
copy 此特質所表達的所屬關系與 strong 類似。然而設置方法并不保留新值,而是將其“拷貝” (copy)。 當屬性類型為 NSString 時,經常用此特質來保護其封裝性,因為傳遞給設置方法的新值有可能指向一個 NSMutableString 類的實例。這個類是 NSString 的子類,表示一種可修改其值的字符串,此時若是不拷貝字符串,那么設置完屬性之后,字符串的值就可能會在對象不知情的情況下遭人更改。所以,這時就要拷貝一份“不可變” (immutable)的字符串,確保對象中的字符串值不會無意間變動。只要實現(xiàn)屬性所用的對象是“可變的” (mutable),就應該在設置新屬性值時拷貝一份。