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:表示直接賦值枣耀,用于基本的數據類型如:NSIntegar霉晕、CGFloat捞奕。C的數據類型如:float、int萌焰、char等。還有id類型
retain:針對對象類型進行內存管理扒俯,修飾對象一疯,實現過程(setter方法會先將舊的屬性release掉,然后再對新的對象進行一次賦值墩邀,并進行一次retain)引用計數會加1
copy:主要修飾NSString類型,表示內容的復制
【當某對象的類具有可修改的子類時荔茬,應該將屬性設為copy。例如:NSString慕蔚,NSArray,NSDictionary】
這樣做的原因是:如果屬性指向的對象的類具有可修改的子類孔飒,那個該屬性可能會指向可修改的子類對象,同時該子類對象可能會被其他擁有者修改桂对。因此,最好先復制該對象蕉斜,然后再將屬性指向復制后的對象缀棍。(編寫具有“防御性”的代碼)
關于@property后面修飾符的一些問題
1、@property (nonatomic睦柴,copy) NSMutableArray *array; 這段代碼會有什么問題?
添加,刪除,修改數組內的元素的時候,程序會因為找不到對應的方法(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)的字符串劳翰,確保對象中的字符串值不會無意間變動。只要實現屬性所用的對象是“可變的” (mutable)供屉,就應該在設置新屬性值時拷貝一份。