typedef int(^myblock)();
void cfun(void(^blockname1)(), myblock blockname2)
-(void)ocfun:(void(^)())blockname1 andotherblock:(myblock)blockname2
在oc中呼叫cfun,直接cfun就可以了,但是ocfun就需要 [self ocfun].
block是乙個特殊的oc物件, 它建立在棧上, 而不是堆上, 這麼做乙個是為效能考慮,還有就是方便訪問區域性變數.
預設情況下block使用到的區域性變數都會被保留,而不是複製.
所以它無法改變區域性變數的值.
如果在變數面前加上__block, 那就是告訴編譯器, 當吧快從棧移動到堆上的時候,要把變數也複製乙份放到堆上, 這樣我們就可以改變變數.
另外塊是在棧上分配的, 所以一旦離開作用域, 就會釋放, 因此如果你要把快用在別的地方, 必須要複製乙份.
所以在屬性定義乙個快的時候需要使用copy: @property (nonatomic, copy) void (^ontextentered)(nsstring *enteredtext);
塊是不能保留的, retain對塊沒有意義
arc下block何時會從棧自動被複製到堆, 以及__block和__weak的使用問題
由於block是預設建立在棧上, 所以如果離開方法作用域, block就會被丟棄, 在非arc情況下, 我們要返回乙個block ,需要 [block copy];
在arc下, 以下幾種情況, block會自動被從棧複製到堆:
1.被執行copy方法
2.作為方法返回值
3.將block賦值給附有__strong修飾符的id型別的類或者blcok型別成員變數時
4.在方法名中含有usingblock的cocoa框架方法或者gdc的api中傳遞的時候.
對於非arc下, 為了防止迴圈引用, 我們使用__block來修飾在block中實用的物件:
__block id blockself=self;
self.block=^;
對於arc下, 為了防止迴圈引用, 我們使用__weak來修飾在block中實用的物件:
__weak id weakself=self;
self.block=^;
如果要在arc下, 為了防止迴圈引用, 使用__block來修飾在block中實用的物件,仍然會被retain, 所以需要多做一些設定
__block id blockself=self;
self.block=^;
並且一定要執行一次block();
這樣就使block斷開了與blockself的持有關係, 這是使用__block是為了允許在block修改其值.
ios 全面解析block
block block變數格式 返回值型別 不可省略,最少void,沒有 變數名稱 引數 不可省略,至少 無引數無返回值 void noparamblock noparamblock void voidparamblock void void voidparamblock void blocknam...
ios學習 block深度解析
1.block的本質是乙個objective c的物件,為什麼這麼說?在objective c中,runtime會在執行時根據物件的isa指標的指向,來度額定這個物件的型別,也可以認為乙個物件,它具有isa指標,就是乙個oc物件 2.你怎麼知道block有isa指標呢,我們可以通過clang命令將來...
iOS開發之block解析
1.block的本質是乙個objective c的物件。為什麼這麼說?在objective c中。runtime會在執行時依據物件的isa指標的指向,來度額定這個物件的型別。也能夠覺得乙個物件。它具有isa指標。就是乙個oc物件 2.你怎麼知道block有isa指標呢。我們能夠通過clang命令將來...