預設情況下,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在...