iOS之Block為什麼用copy修飾

2021-08-06 07:27:02 字數 1464 閱讀 6493

在通讀文章之前,您可能需要了解記憶體分配的基礎知識。

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

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

[objc]view plain

copy

#import "viewcontroller.h"

@inte***ce

viewcontroller ()  

@property

(nonatomic

, copy

) void

(^myblock)();  

@end

@implementation

viewcontroller  

- (void

)viewdidload ;  

nslog(@"%@"

,myblock

1);  

//2 __nsstackblock__  棧block  儲存在棧區

//block內部訪問外部變數

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

intn = 

5;  

void

(^myblock

2)() = ^() ;  

nslog(@"%@"

, myblock

2);  

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

void

(^myblock

3)() = ^() ;  

nslog(@"%@"

, [myblock

3copy

]);  

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

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

以下示例:

*/[self

test

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

self

.myblock

();  

}  - (void

)test ];  

nslog(@"test--%@"

,self

.myblock

);  

}  @end

**:

Block為什麼用copy修飾

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

從堆疊剖析block為什麼用copy

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

python為什麼用flask 為什麼用flask

flask是python在web開發領域乙個輕量級的框架,為什麼選擇flask呢?此文可能會給你答案。選擇flask的原因 1.微框架 簡潔 只做它需要做的,給開發展提供了很大的擴充套件性。2.flask和相關的依賴 jinja2 werkzeug 設計得非常優秀,用著簡單。3.開發效率非常高,比如...