在通讀文章之前,您可能需要了解記憶體分配的基礎知識。
預設情況下,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.開發效率非常高,比如...