分塊書寫掰盘,可能有點(diǎn)亂可能有重復(fù)豪嗽,內(nèi)容還是很全的嘿期。
Delegate修飾詞
Delegate為了防止循環(huán)引用一般用weak和assign修飾,但這兩者是有區(qū)別的,比如說(shuō)A對(duì)象的delegate就是一個(gè)viewController哨鸭,并且viewController對(duì)A對(duì)象也強(qiáng)引用了.
- 如果用weak修飾通今,那么當(dāng)viewController釋放后粥谬,A對(duì)象的delegate會(huì)自動(dòng)置為nil
- 如果用assign修飾,當(dāng)viewController釋放后辫塌,A對(duì)象的delegate會(huì)變成野指針漏策,要防止這種情況,就要重寫viewController的dealloc方法臼氨,手動(dòng)將A對(duì)象的delegate置為nil.
- (void)dealloc{
self.A.delegate = nil;
};
ARC與MRC下有什么不同掺喻?就是MRC下只能用assign修飾,而在ARC下既能用weak也能用assign储矩,只是用assign要做多一定工作感耙,在蘋果官方文檔中,都是用的week修飾詞
UITableViewDelegate,UITableViewDataSource
@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;
屬性 是可以說(shuō)是面向?qū)ο笳Z(yǔ)言中封裝的一個(gè)體現(xiàn)持隧,在自定義類中設(shè)置 ‘屬性’ 就相當(dāng)于定義了一個(gè)私有變量即硼、設(shè)置器(setter方法)以及訪問(wèn)器(getter方法),其中無(wú)論是變量的定義屡拨,方法的聲明和實(shí)現(xiàn)都是系統(tǒng)自動(dòng)生成的并且經(jīng)過(guò)了相應(yīng)地內(nèi)存管理和優(yōu)化只酥,無(wú)需開發(fā)者操心。
屬性的聲明:
屬性一般定義在類的接口呀狼,或類的延展內(nèi)裂允,并且放在方法的聲明之前,成員變量的聲明之后赠潦。屬性關(guān)鍵字是@property叫胖,括號(hào)內(nèi)的是屬性的屬性,然后是變量的類型和名字她奥,屬性的定義一般分為兩種情況瓮增,一種是非對(duì)象類型的變量,如int整型哩俭,使用assign绷跑,第二種是對(duì)象類型的變量(NSobject),使用retain或copy(delegate除外)
@property和@synthesize幫我們輕易的生成對(duì)象的getter和setter方法來(lái)完成對(duì)對(duì)象的賦值和訪問(wèn)凡资。但是如果我們?nèi)绻獎(jiǎng)討B(tài)設(shè)置對(duì)象的getter和setter方法可以使用@property和@dynamic組合砸捏。對(duì)象訪問(wèn)方法property的屬性設(shè)置非常多谬运。
1.atomic 和 nonatomic
atomic是默認(rèn)的屬性,表示對(duì)對(duì)象的操作屬于原子操作垦藏,主要提供多線程訪問(wèn)的安全梆暖。在多線程的下對(duì)對(duì)象的訪問(wèn)都需要先上鎖訪問(wèn)后再解鎖,保證不會(huì)同時(shí)有幾個(gè)操作針對(duì)同一個(gè)對(duì)象掂骏。使用atomic比nonatomic更耗費(fèi)系統(tǒng)資源轰驳,訪問(wèn)性能低。
nonatomic 表示訪問(wèn)器的訪問(wèn)不是原子操作弟灼,不支持多線程訪問(wèn)安全级解,但是訪問(wèn)性能高。
2.readwrite 和readonly
readwrite 是默認(rèn)的屬性田绑,表示可以對(duì)對(duì)象進(jìn)行讀和寫勤哗,會(huì)生成對(duì)象相應(yīng)的setter和getter方法。
**readonly **表示只允許讀取對(duì)象的值掩驱,只會(huì)生成對(duì)象的getter方法芒划。
3. assign retain和copy
retain 表示對(duì)NSObject和及其子類對(duì)象release舊值,再retain新值昙篙,使對(duì)象的應(yīng)用計(jì)數(shù)增加一腊状。
此屬性只能使用于obejective-c類型對(duì)象诱咏,而不能用于Core Foundation對(duì)象苔可。(retain會(huì)增加對(duì)象的引用計(jì)數(shù),而基本數(shù)據(jù)類型或者Core Foundation對(duì)象都沒(méi)有引用計(jì)數(shù)袋狞,把對(duì)象添加到數(shù)組中時(shí)焚辅,引用計(jì)數(shù)將增加1)。
-(void) setOldValue: (NSString*) newValue {
if (newValue !=oldValue) {
[oldValue release];
oldValue = [newValue retain];
}
}
**assign ** 是默認(rèn)屬性苟鸯,只可以對(duì)基本數(shù)據(jù)類型(如CGFloat同蜻,NSInteger,Bool,int,代理對(duì)象)等使用。該方式會(huì)對(duì)對(duì)象直接賦值而不會(huì)進(jìn)行retain操作早处。
**copy ** 表示重新建立一個(gè)新的計(jì)數(shù)為1的對(duì)象湾蔓,然后釋放掉舊的值。
都知道retain是對(duì)指針的拷貝砌梆,copy是對(duì)內(nèi)容的拷貝默责。
比如:NSString 對(duì)象的地址為0x100,其內(nèi)容為“string”咸包,如果使用copy到另外一個(gè)NSString對(duì)象桃序,則會(huì)生成另外一個(gè)地址為0x110的對(duì)象,只不過(guò)內(nèi)容仍然是‘string“烂瘫。如果使用retain到另外一個(gè)NSString對(duì)象媒熊,則該對(duì)象的地址仍然為0x100,只不過(guò)該對(duì)象的計(jì)數(shù)變?yōu)?.
NSString、NSArray芦鳍、NSDictionary 經(jīng)常使用 copy 關(guān)鍵字,是因?yàn)樗麄冇袑?duì)應(yīng)的可變類型:NSMutableString嚷往、NSMutableArray、NSMutableDictionary.
為確保對(duì)象中的屬性值不會(huì)無(wú)意間變動(dòng),應(yīng)該在設(shè)置新屬性值時(shí)拷貝一份,保護(hù)其封裝性block柠衅,也經(jīng)常使用 copy间影,關(guān)鍵字block。
使用 copy 是從 MRC 遺留下來(lái)的“傳統(tǒng)”,在 MRC 中,方法內(nèi)部的 block 是在棧區(qū)的,使用 copy 可以把它放到堆區(qū).
在 ARC 中寫不寫都行:對(duì)于 block 使用 copy 還是 strong 效果是一樣的,但是建議寫上 copy.!!!
@property(copy)NSMutableArray *array;(這樣寫的問(wèn)題)
因?yàn)?copy 策略拷貝出來(lái)的是一個(gè)不可變對(duì)象,然而卻把它當(dāng)成可變對(duì)象使用,很容易造成程序奔潰這里還有一個(gè)問(wèn)題.
該屬性使用了同步鎖,會(huì)在創(chuàng)建時(shí)生成一些額外的代碼用于幫助編寫多線程程序,這會(huì)帶來(lái)性能問(wèn)題.
通過(guò)聲明 nonatomic 可以節(jié)省這些雖然很小,但是不必要額外開銷,在 iOS 開發(fā)中應(yīng)該使用 nonatomic 替代 atomic.
4.strong 和 weak
在ARC的模式下茄茁,對(duì)象聲明時(shí)需要加入strong和weak魂贬,方便內(nèi)存的自動(dòng)管理。默認(rèn)情況下是strong類型裙顽。
strong 強(qiáng)引用付燥,默認(rèn)的屬性,類似于retain愈犹,其實(shí)是一個(gè)相對(duì)的概念键科,就是一個(gè)引用。如果有一個(gè)強(qiáng)引用持有該對(duì)象漩怎,則該對(duì)象就不能被釋放勋颖。默認(rèn)的所有實(shí)例變量和局部變量都是strong指針。
weak 弱引用勋锤,類似于assign饭玲,弱引用除了不決定對(duì)象的存亡外,其他與強(qiáng)引用相同叁执。
即使一個(gè)對(duì)象被持有無(wú)數(shù)個(gè)弱引用茄厘,只要沒(méi)有強(qiáng)引用指向他,那麼其還是會(huì)被清除谈宛,它不是對(duì)象的擁有者次哈。其值會(huì)在對(duì)象被釋放后自動(dòng)設(shè)置為nil。
delegate 代理屬性,代理屬性也可使用
assign自身已經(jīng)對(duì)它進(jìn)行一次強(qiáng)引用,沒(méi)有必要再?gòu)?qiáng)引用一次,此時(shí)也會(huì)使用 weak
自定義IBOutlet 控件屬性一般也使用weak;也可以使用 strong,但是建議使用 weak
weak指針主要用于“父-子”關(guān)系吆录,父親擁有一個(gè)兒子的strong指針窑滞,因此父親是兒子的所有者;但為了阻止所有權(quán)循環(huán),兒子需要使用weak指針指向父親恢筝。典型例子是delegate模式,你的ViewController通過(guò)strong指針(self.view)擁有一個(gè)UITableView, UITableView的dataSource和delegate都是weak指針,指向你的ViewController
weak 和 assign 的不同點(diǎn)
weak 在屬性所指的對(duì)象遭到摧毀時(shí),系統(tǒng)會(huì)將 weak 修飾的屬性對(duì)象的指針指向 nil,在 OC 給 nil 發(fā)消息是不會(huì)有什么問(wèn)題的;
assign 在屬性所指的對(duì)象遭到摧毀時(shí),屬性對(duì)象指針還指向原來(lái)的對(duì)象,由于對(duì)象已經(jīng)被銷毀,這時(shí)候就產(chǎn)生了野指針.
!!!如果這時(shí)候在給此對(duì)象發(fā)送消息,很容造成程序奔潰assigin 可以用于修飾非 OC 對(duì)象,而 weak 必須用于 OC 對(duì)象哀卫。
@synthesize 和 @dynamic 分別有什么作用
- @property 有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是@synthesize,一個(gè)是@dynamic。
如果@synthesize 和@dynamic 都沒(méi)寫,那么默認(rèn)的就是
@syntheszie var = _var;
- @synthesize 的語(yǔ)義是如果你沒(méi)有手動(dòng)實(shí)現(xiàn) setter 方法和 getter 方法,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法滋恬。
- @dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成聊训。(當(dāng)然對(duì)于 readonly 的屬性只需提供 getter 即可)
假如一個(gè)屬性被聲明為 - @dynamic var;然后你沒(méi)有提供@setter 方法和@getter 方法,編譯的時(shí)候沒(méi)問(wèn)題,但是當(dāng)程序運(yùn)行到 instance.var = someVar,由于缺 setter方法會(huì)導(dǎo)致程序崩潰;
或者當(dāng)運(yùn)行到 someVar = instance.var 時(shí),由于缺 getter 方法同樣會(huì)導(dǎo)致崩潰.