Block為什麼用copy修飾

2021-07-11 18:55:12 字數 1147 閱讀 3060

預設情況下,block是存檔在棧中,可能被隨時**,通過copy操作可以使其在堆中保留乙份, 相當於一直強引用著, 因此如果block中用到self時, 需要將其弱化, 通過__weak或者__unsafe_unretained.  以下是示例**及其說明,  讀者可以試著列印出不同情況下block的記憶體情況

//

// viewcontroller.m

// 為什麼block用copy修飾

//// created by wangjunling on 16/5/12.

//#import "viewcontroller.h"

@inte***ce viewcontroller ()

@property (nonatomic, copy) void(^myblock)();

@end

@implementation viewcontroller

- (void)viewdidload ;

nslog(@"%@",myblock1);

//2 __nsstackblock__ 棧block 儲存在棧區

//block內部訪問外部變數

//block的本質是乙個結構體

int n = 5;

void(^myblock2)() = ^() ;

nslog(@"%@", myblock2);

//3 __nsmallocblock__ 堆block 儲存在堆區 對棧block做一次copy操作

void(^myblock3)() = ^() ;

nslog(@"%@", [myblock3 copy]);

/*由以上三個例子可以看出當block沒有訪問外界的變數時,是儲存在**區,

當block訪問外界變數時時儲存在棧區, 而此時的block出了作用域就會被釋放

以下示例:

*/[self test];//當此**結束時,test函式中的所有儲存在棧區的變數都會被系統釋放, 因此如果屬性的block是用assign修飾時 當再次訪問時就會出現野指標訪問.

self.myblock();

}- (void)test ];

nslog(@"test--%@",self.myblock);

}@end

iOS之Block為什麼用copy修飾

在通讀文章之前,您可能需要了解記憶體分配的基礎知識。預設情況下,block是存檔在棧中,可能被隨時 通過copy操作可以使其在堆中保留乙份,相當於一直強引用著,因此如果block中用到self時,需要將其弱化,通過 weak或者 unsafe unretained.以下是示例 及其說明,讀者可以試著...

從堆疊剖析block為什麼用copy

1.首先理解連個概念 堆 heap heap的空間需要手動分配。heap 與動態記憶體分配相關 記憶體可以隨時在堆中分配和銷毀。我們需要明確請求記憶體分配與記憶體銷毀。簡單來說,就是malloc與free.棧 stack stack的空間由作業系統進行分配。在現代作業系統中 乙個執行緒會分配乙個 s...

Block用copy來修飾

block使用copy是從mrc遺留下來的 傳統 在mrc中,方法內部的block是在棧區的,使用copy可以把它放到堆區.在arc中寫不寫都行 對於block使用copy還是strong效果是一樣的,但寫上copy也無傷大雅,還能時刻提醒我們 編譯器自動對block進行了copy操作。block在...