iOS開發 Block 核心原理

2021-10-23 16:55:04 字數 3069 閱讀 4747

如何深入學習相關概念呢?

將oc**轉化成c++**,檢視其內部實現。

面試過程中,每道題都是有對應分數的,一定要盡可能答的漂亮。

什麼是block

什麼是block?

你對block的呼叫是怎麼理解的?

截獲變數是block的一大特性,系統對於block的截獲是怎麼實現的呢?

我們新增__block修飾符做什麼事情呢?

什麼時候需要對block 進行乙個copy操作,棧block和堆block是否了解呢?

6.block的迴圈引用

block是乙個物件,封裝了執行函式和上下文。

原始碼解析

+ (void)testblock1;

block(2);

}

使用:

clang -rewrite-objc file.m

檢視編譯後的檔案內容

struct __block_impl ;

struct __testobject__testblock1_block_impl_0

};static int __testobject__testblock1_block_func_0(struct __testobject__testblock1_block_impl_0 *__cself, int num)

static struct __testobject__testblock1_block_desc_0 __testobject__testblock1_block_desc_0_data = ;

// _c 表示類方法,_i 例項方法 ,tstobject 表示類名,testblock1表示函式名

static void _c_testobject_testblock1(class self, sel _cmd)

block呼叫即是函式的呼叫。 從block中取出函式指標傳遞兩個引數block和需要的引數。

__block修飾符

使用場景:

一般情況下,對被截獲變數進行賦值操作需要新增__bloc修飾符。

__block修飾的變數變成了物件。

+ (void)testblock1;

block(2);

}// 編譯成c++檔案後

struct __block_byref_multiplier_0 ;

struct __testobject__testblock1_block_impl_0

};static void _c_testobject_testblock1(class self, sel _cmd) ;

int (*block)(int) = ((int (*)(int))&__testobject__testblock1_block_impl_0((void *)__testobject__testblock1_block_func_0, &__testobject__testblock1_block_desc_0_data, (__block_byref_multiplier_0 *)&multiplier, 570425344));

((int (*)(__block_impl *, int))((__block_impl *)block)->funcptr)((__block_impl *)block, 2);

}

使用 不等於 賦值

筆試題

// 問題:此處是否需要對array 使用__block進行修飾呢

nsmutablearray * array = [[nsmutablearray alloc] init];

void (^block)(void) = ^;

block();

nslog(@"array = %@",array);

此處不需要,僅僅為使用。

下面這個呢:

區域性變數不管物件型別是基本資料型別還是物件型別,進行賦值操作都需要新增__block修飾符。

對變數進行賦值時,

需要__block修飾符

block記憶體管理

不論在任何記憶體位置,都可以順利的訪問同乙個__block變數。

迴圈引用

_array = [nsmutablearray arraywithobject:@"block"];

_strblk = ^nsstring *(nsstring *num) ;

_strblk(@"hello");

// 解決方式

_array = [nsmutablearray arraywithobject:@"block"];

__weak nsarray * weakarray = _array;

_strblk = ^nsstring *(nsstring *num) ;

_strblk(@"hello");

此時如果不呼叫或者是長時間不呼叫的話,環就會一直存在。

iOS開發 Block詳解

block是乙個非常有特色的語法,它可以把乙個 塊作為乙個變數來儲存,也可以通過函式傳遞變數,然後讓其他的物件來執行這一 塊。可以儲存傳遞並在其他地方執行的 塊,這是我對block的理解,也是我覺得block最吸引我的地方。直接定義 返回block指標 返回型別 可省略 引數型別 引數 沒有引數可省...

iOS開發 block介紹

void viewdidload nslog 我在看電視 void chargemyiphone void void finishblock void void finishblock 第乙個void表示此block無返回值。為block type的標誌。第二個 void 表示這個block無引數。...

iOS 底層原理之 Block

block 本質上也是乙個 oc 物件,它內部也有個 isa 指標 block 是封裝了函式呼叫以及函式呼叫環境的 oc 物件 block 的底層結構如下圖所示 原始碼解析 struct gsblock load block impl 0 block impl struct block impl g...