block是匿名函數(shù),能夠?qū)崿F(xiàn)函數(shù)回調(diào)功能
block可以訪問block函數(shù)以及語法作用區(qū)域以內(nèi)的外部變量
用于頁面之間通信,同時可以進行傳值
void(^block)(void) = ^(void) { };
其中:
1.void(^block)(void)
是類型
2.block
是變量名
3.^(void){};
是block實現(xiàn) ,上述方法等號后邊的返回值類型和參數(shù)列表都可以省略.
block的內(nèi)存管理:
- 沒有使用局部變量的block內(nèi)存存儲在全局區(qū)
- block內(nèi)部使用局部變量的時候內(nèi)存存儲在棧區(qū).
- 當block變量定義為屬性的時候,必須使用copy修飾,retain無效,即retain和assign會造成野指針問題.
(當對block進行copy操作的時候,此時block的內(nèi)存區(qū)域為堆區(qū).)
1.當block里面會有b類相關的參數(shù)要回調(diào)回去的時候套鹅,屬性用copy修飾逢渔,將其拷貝到堆里面铁蹈,這樣即便棧釋放掉了怠噪,b類的指針也在堆中存在,能夠成功的回調(diào)回去碌嘀。
2.如果語法塊僅僅是執(zhí)行而不再回調(diào)回去了, 比如操作某個數(shù)據(jù)庫歪架,修改某個單利類的屬性股冗,發(fā)送某個通知之類的,則可以用weak來修飾和蚪。
注意:這里不都用copy止状,原因是優(yōu)化內(nèi)存。 如果這個類要傳入1000Block來執(zhí)行攒霹,而這個類又不會馬上釋放掉的話怯疤,用copy是不是就拷貝了1000個在堆里面? 這樣就會占用很大一部分內(nèi)存催束,如果使用了weak將不必要的執(zhí)行后就可以馬上釋放掉是不是就節(jié)約了很多的內(nèi)存了集峦。
** __weak在ARC下修飾,__block在MRC下修飾,防止循環(huán)引用.
** __block:第二個作用,修飾局部變量,MRC和ARC通用.***在block內(nèi)部不能直接修改局部變量的值, 如果想修改必須聲明成__block類型的變量 ***