iOS關於block的記憶體管理

2021-07-05 12:51:37 字數 1022 閱讀 9034

person *person = [[person alloc]init];

int a = 20;

person.age = [nsstring stringwithformat:@"%d",a];

void (^myblock2)() = ^; //無引數無返回值的 ++a; //呼叫block myblock();

我們在block內部呼叫乙個區域性變數,當我們在呼叫block之前改變這個變數的值,是沒有辦法影響block內部,因為底層block的實現,傳入block中的的相當於是乙個常量

staic  int a = 10;

//返回值 ^是宣告block的關鍵字 block名字緊跟其後,block名字後面是引數.

void (^myblock)() = ^; //無引數無返回值的

++a;

//呼叫block

myblock();

我們在block內部呼叫乙個靜態變數,全域性變數,__block修飾的變數,在呼叫block之前改變這個變數的值,會影響block內部中的這些變數,因為這些變數傳入block中,相當於是乙個指標.

block根據儲存位置分為三種,第一:如果block內部引入的是區域性變數(基礎型別,物件型別),此時block位於棧區.

第二,如果block內部引入的是全域性靜態變數,那麼我們建立的block就在全域性靜態區(不用我們管理記憶體,由系統管理,當程式執行終止後會**資源).

第三,如果我們對位於棧區的block進行拷貝的時候,那麼block就會由棧區公升級到堆區,但是當我們對全域性靜態區的block進行拷貝的時候,並沒有什麼卵用.因為copy關鍵字只對棧區有效.

第四,如果我們的區域性變數是物件型別,當進行copy的時候,會對所引用的物件的引用計數+1,進而出現記憶體問題.

5 解決記憶體問題:__block 加上該關鍵字就是告訴系統,copy的時候,不對所引用物件的引用計數+1  ;block_release,當對copy到堆區的block進行釋放的時候,告訴系統會對所引用的物件的引用計數- 1.

iOS的block記憶體管理

初始情況下 block本身 block修飾的變數以及在block內部使用的變數都是在棧裡的。block修飾的變數的位址會作為實參傳入block塊內部 暫時先這麼理解,實際比較複雜 block使用的外部變數被const拷貝到了block內部。也就是block使用的外部變數和這個外部變數本身沒有關係。c...

block 記憶體管理

block簡介 copy一段 block作為c語言的擴充套件,並不是高新技術,和其他語言的閉包或lambda表示式是一回事。需要注意的是由於objective c在ios中不支援gc機制,使用block必須自己管理記憶體,而記憶體管理正是使用block坑最多的地方,錯誤的記憶體管理 要麼導致retu...

block的記憶體管理

block的記憶體管理 block變數是儲存在棧記憶體中的,所以宣告屬性時,應該使用copy屬性,將其複製到堆記憶體中。block在dealloc中釋放時,使用函式 block release 假如在customview中宣告了乙個block,在customviewcontroller中建立了乙個c...