在以前,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的記憶體就會在堆中
所以,只需要在dog類前面加上__block即可!* 它會對所引用的物件做一次retain操作
* 非arc : 如果所引用的物件用了__block修飾, 就不會做retain操作
* arc : 如果所引用的物件用了__unsafe_unretained\__weak修飾, 就不會做retain操作
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又強指標指...