ios 全面解析block

2021-08-27 14:28:10 字數 1371 閱讀 7775

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命令將來...