在以前,mrc環境下,使用block很可能會出現記憶體洩漏問題,並且在以往的面試中,一些接觸比較久的程式設計師都會喜歡問到這個問題,block記憶體洩漏的問題!
下面,我來介紹一下,mrc下block記憶體洩漏的乙個問題
先隨意建立乙個dog類,並建立int型別age屬性,
然後在main函式中,建立下列**,
int main(int argc, const char * argv)
; block();
[d release];
}}這個時候是正常情況,但是,如果新增如下第10行**:
int main(int argc, const char * argv)
; block_copy(block);
block();
[d release];
}}此時此刻,有人想對block進行release,但是不管你是否對block進行release ,都無法釋放d物件。為什麼呢??
這個時候,我們就要對block進行分析了:
1.預設情況下, block的記憶體是在棧中
* 它不會對所引用的物件進行任何操作
2.如果對block做一次copy操作, block的記憶體就會在堆中
* 它會對所引用的物件做一次retain操作
* 非arc : 如果所引用的物件用了__block修飾, 就不會做retain操作
* arc : 如果所引用的物件用了__unsafe_unretained\__weak修飾, 就不會做retain操作
所以,只需要在dog類前面加上__block即可! ARC和MRC下的block的記憶體分布詳解
block有三種型別,分別是 nsglobalblock 全域性block,程式被載入後被分配在程序資料段上 類似函式,位於text段 也就是常量,靜態建立的block。nsmallocblock 在程序堆上分配的block,動態建立的block。nsstackblock 程序棧上分配的block,...
ARC和MRC下Block的使用注意
1.是一段 塊,只在被呼叫的時候執行 類似於方法和函式 2.是一種資料型別 類似於 int nsstring 3.可以定義成臨時變數 4.可以當做引數傳遞 5.可以定義成屬性 6.是一種匿名函式 重要,只有函式體,沒有函式名 7.是乙個指向函式的指標 乙個指標物件,block的名字就是指標的位址 8...
iOS 簡單的 block 記憶體洩漏問題
注意 block 用 copy 引用 typedef int myblock int,int void play nslog play int main int argc,const char ar autoreleasepool 記憶體洩漏問題 block 裡面引用 self 而self又強指標指...