MRC環境下block記憶體洩漏問題

2021-07-02 20:36:33 字數 827 閱讀 2506

在以前,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又強指標指...