使用Block需注意的問題

1、block中引用外部變量
block中引用外部變量時,通常會把對象當做常量變量編碼到block中,并且在block中嘗試改變外部變量的值會報錯,解決辦法是引入__block標識符,需要在block內(nèi)部修改的變量標識為__block scope
2、block自身的內(nèi)存管理
block本身是像對象一樣可以retain,和release。但是,block在創(chuàng)建的時候,它的內(nèi)存是分配在棧(stack)上,而不是在堆(heap)上。他本身的作于域是屬于創(chuàng)建時候的作用域,一旦在創(chuàng)建時候的作用域外面調(diào)用block將導致程序崩潰。解決的方法就是在創(chuàng)建完block的時候需要調(diào)用copy的方法。copy會把block從棧上移動到堆上,那么就可以在其他地方使用這個block了:`_block = [_blockcopy];

3、循環(huán)引用
在block創(chuàng)建中:_block = ^( ) { NSLog:(@“string %@“,_string ) }; _string是成員變量
這里的_string相當于是self->_string;那么block是會對內(nèi)部的對象進行一次retain。也就是說,self會被retain一次。當self釋放的時候,需要block釋放后才會對self進行釋放,但是block的釋放又需要等self的dealloc中才會釋放。如此一來變形成了循環(huán)引用,導致內(nèi)存泄露。修改方案是新建一個__block scope的局部變量,并把self賦值給它,而在block內(nèi)部則使用這個局部變量來進行取值。因為__block標記的變量是不會被自動retain的。
__block ViewController *controller = self;
_block = ^(){NSLog(@"string %@", controller->_string); };

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容