修改block內(nèi)部變量,如果一個(gè)變量在block外部聲明的話,那個(gè)變量必須要用__block去修飾,__block不管是在ARC和MRC環(huán)境下都可以使用修飾對(duì)象和基本數(shù)據(jù), __weak只能在ARC環(huán)境下只能修飾對(duì)象.
block循環(huán)引用:block調(diào)用了 主對(duì)象則可能發(fā)生循環(huán)使用.避免方法__weak或者_(dá)_unsafe_unretained來(lái)修飾block
在聲明block時(shí),要用copy.因?yàn)閎lock是存檔在棧中,需要拷貝到堆區(qū),防止被釋放掉. 在多線程環(huán)境下,block有可能會(huì)被析構(gòu) 需要將self轉(zhuǎn)為strong指針.
既然上面說(shuō)到了內(nèi)存就簡(jiǎn)述一下:
內(nèi)存基本構(gòu)成:
1.靜態(tài)存儲(chǔ)區(qū):主要是存放靜態(tài)數(shù)據(jù),全局變量和常量
2.棧去:在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)部局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行完這些單元自動(dòng)釋放.效率高內(nèi)存有限
3.堆區(qū):動(dòng)態(tài)內(nèi)存.程序在運(yùn)行的時(shí)候用alloc和new申請(qǐng)內(nèi)存.生存期可以控制,如果不釋放,程序結(jié)束釋放掉.如果某動(dòng)態(tài)內(nèi)存不在使用需要立即釋放掉否則內(nèi)存泄露.
4.代碼區(qū):存放函數(shù)體的二進(jìn)制代碼
5.常量區(qū):存放常量的字符串