Block 與 循環(huán)引用
1霞溪、 在所有的Block中侧漓,使用self 都會(huì)引起循環(huán)引用嗎咒劲?
?答:不一定.循環(huán)引用的原因是相互指引,相互是關(guān)鍵.如果相互這一層關(guān)系達(dá)不到就沒(méi)有所謂的循環(huán)引用
2继薛、 UIView動(dòng)畫為什么不會(huì)引起循環(huán)引用?
?答:UIView的調(diào)用的是類方法,當(dāng)前控制器不可能強(qiáng)引用一個(gè)類 爽待,所以循環(huán)無(wú)法形成
3损同、 masory為什么不會(huì)引起循環(huán)引用?
?答:UIView的調(diào)用的是類方法,當(dāng)前控制器不可能強(qiáng)引用
4鸟款、AFN為什么不會(huì)引起循環(huán)引用?
?答:不一定分情況膏燃, AFN無(wú)循環(huán)是因?yàn)榻^大部分情況下,你的網(wǎng)絡(luò)類對(duì)象是不會(huì)被當(dāng)前控制器引用的何什,這時(shí)就不會(huì)形成引用環(huán)组哩。
5、那么什么情況下會(huì)引起循環(huán)引用处渣?
? 1伶贰、 強(qiáng)引用自定義的block. 里面再次調(diào)用self,導(dǎo)致的循環(huán)引用.
? 2 、循環(huán)引用的發(fā)生的條件就是強(qiáng)持有這個(gè)block ,并且被block里面的加入的對(duì)象強(qiáng)持有.
? 3罐栈、使用NSNotification 使用系統(tǒng)自帶的block 會(huì)發(fā)生循環(huán)引用.如下:
[[NSNotificationCenter defaultCenter] addObserverForName:@"" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * note) {
NSLog(@"%@",self.view);
}];
6黍衙、循環(huán)引用解決辦法?
?答:
? 1荠诬、 事前避免琅翻,我們?cè)跁?huì)產(chǎn)生循環(huán)引用的地方使用 weak 弱引用,以避免產(chǎn)生循環(huán)引用柑贞。
? 2望迎、事后補(bǔ)救,我們明確知道會(huì)存在循環(huán)引用凌外,但是我們?cè)诤侠淼奈恢弥鲃?dòng)斷開(kāi)環(huán)中的一個(gè)引用,使得對(duì)象得以回收涛浙。
block 與 內(nèi)存管理
1康辑、 block是什么數(shù)據(jù)類型?
?答:block其實(shí)是一個(gè)結(jié)構(gòu)體 可反編譯查看cpp文件
2轿亮、 block為什么對(duì)它內(nèi)部的對(duì)象默認(rèn)強(qiáng)引用呢疮薇?
?答:block會(huì)對(duì)它內(nèi)部的對(duì)象強(qiáng)引用一次。應(yīng)該是為了防止內(nèi)部的對(duì)象離開(kāi)對(duì)象的代碼環(huán)境不至于被釋放掉我注,還能繼續(xù)使用按咒。PS:需要注意的是,對(duì)對(duì)象的強(qiáng)引用不是對(duì)對(duì)象的屬性等強(qiáng)引用
3但骨、 Block作為類變量屬性時(shí)為啥用copy修飾励七?堆棧存儲(chǔ)位置是怎樣的智袭?
? 答:block聲明之后內(nèi)存是存在于棧上的,而不是存在于堆上.它本身的作用域是創(chuàng)建時(shí)的作用域,一旦在作用外的地方調(diào)用block將導(dǎo)致程序崩潰
? 使用retain也可以,但是 block的retain行為 默認(rèn)是用copy實(shí)現(xiàn)的.
? 因?yàn)閎lock變量默認(rèn)為棧變量,為了能夠在block聲明的作用域外使用,所以把block拷貝到堆上去,所以說(shuō)為了block屬性聲明和實(shí)際的操作一致,最好聲明為copy.
? :在Objective-C語(yǔ)言中,一共有3種類型的block:
? 1._NSConcreteGlobalBlock 全局的靜態(tài)block掠抬,不會(huì)訪問(wèn)任何外部變量吼野。
? 2._NSConcreteStackBlock 保存在棧中的block,當(dāng)函數(shù)返回時(shí)會(huì)被銷毀两波。
? 3._NSConcreteMallocBlock 保存在堆中的block(從棧中copy過(guò)去的)瞳步,當(dāng)引用計(jì)數(shù)為0時(shí)會(huì)被銷毀。
? Block內(nèi)捕獲變量會(huì)改變自身存儲(chǔ)位置腰奋,包括讀取變量和__block這種寫變量单起,兩種方式(其實(shí)結(jié)果是一樣的)。
?【在MRC下】:存在棧劣坊、全局嘀倒、堆這三種形式。
?【在ARC下】:大部分情況下系統(tǒng)會(huì)把Block自動(dòng)copy到堆上讼稚。