block是不是一個(gè)對(duì)象?是一個(gè)對(duì)象,蘋(píng)果官方文檔有說(shuō)明(搜索working with block)
如何判斷當(dāng)前文件是MRC,還是ARC
1.dealloc能否調(diào)用super,只有MRC才能調(diào)用super
2.能否使用retain,release.如果能用就是MRC
ARC管理原則:只要一個(gè)對(duì)象沒(méi)有被強(qiáng)指針修飾就會(huì)被銷毀,默認(rèn)局部變量對(duì)象都是強(qiáng)指針,存放到
堆里面,只是局部變量的強(qiáng)指針會(huì)在代碼塊結(jié)束后釋放,對(duì)應(yīng)所指向的內(nèi)存空間也會(huì)被銷毀
MRC了解開(kāi)發(fā)常識(shí):1.MRC沒(méi)有strong,weak,局部變量對(duì)象就是相當(dāng)于基本數(shù)據(jù)類型
2.MRC給成員屬性賦值,一定要使用set方法,不能直接訪問(wèn)下劃線成員屬性賦
值,因?yàn)槭褂孟聞澗€是直接賦值(如_name = name),而set方法會(huì)做以下的事情
- (void)setRoom:(Room*)room
{
/*對(duì)舊房間進(jìn)行release响鹃,需要注意的是,第一次對(duì)_room進(jìn)行release沒(méi)有任何
變化案训,因?yàn)閯傞_(kāi)始_room的值是nil买置,對(duì)一個(gè)空指針release是沒(méi)有影響的,先判斷
是否為同一房間,因?yàn)榉块g相同就不需要release和retain强霎,只有房間不同忿项,才需要對(duì)
舊值release,對(duì)新值retain
*/
if(_room!= room) {
[_roomrelease];
_room= [roomretain];
}
}
總結(jié):只要block沒(méi)有引用外部局部變量,不管是在MRC還是ARC中,block都放在全局區(qū)(靜態(tài)區(qū)
static)
MRC:管理block
只要Block引用外部局部變量,block放在棧里面.
block只能使用copy,不能使用retain,使用retain,block還是在棧里面
當(dāng)block代碼塊結(jié)束后就會(huì)被釋放,這樣就無(wú)法在其它方法中調(diào)用block了
ARC:管理block
只要block引用外部局部變量,block放在堆里面
block使用strong.最好不要使用copy,因?yàn)閏opy的set方法并不是直接賦值,而是在set
方法中會(huì)進(jìn)行進(jìn)一步的判斷,判斷是否需要重新開(kāi)辟內(nèi)存以及深拷貝,淺拷貝的問(wèn)題