線性安全的:nonatomic,atomic
訪問權(quán)限的:readonly,readwrite
內(nèi)存管理(ARC):strong,assign,weak,copy
內(nèi)存管理(MRC):assign,retain,copy
指定方法名稱:setter= ,getter=
weak與assign用法的不同:
1>在ARC中,出現(xiàn)循環(huán)引用的時(shí)候,必須要用一端使用weak,比如:自定義View的代理屬性
2>已經(jīng)自身對(duì)它強(qiáng)引用一次,沒有必要再?gòu)?qiáng)引用一次,此時(shí)使用weak,自定義View的子控件屬性一般使用weak,但是也可以使用strong
3>weak當(dāng)對(duì)象銷毀的時(shí)候,指針會(huì)被自動(dòng)設(shè)置為nil,而assign不會(huì),assign可以用非OC對(duì)象,而weak必須用于OC對(duì)象
4>在ARC環(huán)境下,無論是強(qiáng)指針還是弱指針都不需要在dealloc設(shè)置為nil,ARC會(huì)自動(dòng)幫我們處理
copy的使用:
1>對(duì)于字符串和block的屬性一般使用copy
2>字符串使用copy是為了外部把字符串內(nèi)容改了,影響該屬性
3>block使用copy是在MRC遺留下來的,在MRC,方法內(nèi)部的block是在棧區(qū)的,使用copy可以把它放到堆區(qū).在ARC中對(duì)于block使用copy還是strong效果是一樣的
4>@property(nonatomic,copy)NSMutableArray*mutableArray; 使用copy修飾可變是數(shù)組時(shí),調(diào)用了數(shù)組的添加,刪除,修改的方法時(shí),程序會(huì)因?yàn)檎也坏綄?duì)應(yīng)的方法而崩潰,因?yàn)閏opy就是復(fù)制一個(gè)不可變的NSArray的對(duì)象
5>想要的自己的類也支持copy的功能需要以下兩個(gè)操縱:1/遵守NSCopying協(xié)議,2/實(shí)現(xiàn)-(id)copyWithZone:(NSZone*)zone;方法.屬性中使用copy的是字符串和block.
6>在重寫帶copy關(guān)鍵字的setter時(shí)候,一定要調(diào)用一下傳入的對(duì)象的copy方法,然后在賦值給該setter的方法對(duì)應(yīng)的成員變量
@protocol和category中使用@property:
1>在protocol中使用property只會(huì)生成setter和getter方法是聲明,我們使用屬性的目的是希望遵守我協(xié)議的對(duì)象實(shí)現(xiàn)該屬性
2>在category使用@property也是只會(huì)生成setter和getter方法的聲明,如果我們真的需要給category增加屬性的實(shí)現(xiàn),需要借助于運(yùn)行時(shí)的兩個(gè)函數(shù):1.objc_setAssociatedObject2.objc_getAssociatedObject
@synthesize和@dynamic分別的有什么作用:
1>@synthesize和@dynamic是@property兩個(gè)對(duì)應(yīng)的詞,用來修飾屬性變量的,如果@synthesize和@dynamic都沒有寫,默認(rèn)的就是@synthesizevar = _var
2>@synthesize的語(yǔ)義是你沒有手動(dòng)實(shí)現(xiàn)setter和getter方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法
3>@dynamic告訴編譯器,屬性的setter和getter方法用用戶自己實(shí)現(xiàn),不自動(dòng)生成,(注意:對(duì)于readonly的屬性只需要提供getter方法即可).假如一個(gè)屬性被聲明為@dynamicvar ,然后你沒有提供setter和getter方法,在編譯的時(shí)候沒有問題,但是當(dāng)程序運(yùn)行到instance.var=someVar,由于缺少了setter方法會(huì)導(dǎo)致程序崩潰;或者當(dāng)運(yùn)行到someVar=var時(shí).由于缺少getter方法同樣會(huì)導(dǎo)致崩潰.也就是在編譯的時(shí)候沒有問題,但是在運(yùn)行的時(shí)候才會(huì)執(zhí)行相應(yīng)的方法,這就是動(dòng)態(tài)綁定.
[immutableObject copy] // 淺復(fù)制
[immutableObject mutableCopy] //深復(fù)制
[mutableObject copy] //深復(fù)制
[mutableObject mutableCopy] //深復(fù)制
copy:淺拷貝,會(huì)創(chuàng)建新的內(nèi)存空間,并將舊的數(shù)據(jù)的地址值指向新的內(nèi)存空間,當(dāng)新的數(shù)據(jù)修改時(shí)候舊的也會(huì)修改,但是當(dāng)新增對(duì)象的時(shí)候只會(huì)添加某一個(gè)對(duì)象。
Mutable Copy:深拷貝,會(huì)創(chuàng)建兩個(gè)完全獨(dú)立的內(nèi)存空間,數(shù)據(jù)值一樣。