iOS 面試全方位剖析 Block篇

2022-07-16 22:39:18 字數 2621 閱讀 9009

1.block的本意

block本質上也是乙個oc物件,它內部也有個isa指標,

block是封裝了函式呼叫以及函式呼叫環境的oc物件,

block是封裝函式及其上下文的oc物件

2.block截獲變數

#import "sydblcok.h"

// 全域性變數----不截獲全域性變數

int global_var = 4;

// 靜態全域性變數-----不截獲全域性靜態變數

static int static_global_var = 5;

@implementation sydblcok

-(void)method ;

nslog(@"判斷執行順序");

// 區域性靜態變數 -----isa指標

multiplier_static = 4;

nslog(@"result is %d",block(2));

}

編譯後結果

2019-04-16 14:59:38.854104+0800 auditiontest[64047:1220987] viewdidload

2019-04-16 14:59:42.067785+0800 auditiontest[64047:1220987] multiplier_static:3

2019-04-16 14:59:42.067970+0800 auditiontest[64047:1220987] 判斷執行順序

2019-04-16 14:59:42.068081+0800 auditiontest[64047:1220987] 區域性變數》基本資料型別:6

2019-04-16 14:59:42.068182+0800 auditiontest[64047:1220987] 區域性變數》物件型別(null)----strong:(null)

2019-04-16 14:59:42.068276+0800 auditiontest[64047:1220987] 區域性static:4

2019-04-16 14:59:42.068366+0800 auditiontest[64047:1220987] 全域性變數4

2019-04-16 14:59:42.068459+0800 auditiontest[64047:1220987] 靜態全域性變數:5

2019-04-16 14:59:42.068563+0800 auditiontest[64047:1220987] result is 8

cpp檔案解析

__main_block_desc_0 :block描述資訊

block_size:block的大小

3. block修飾符

/*

* 修飾符的使用----對被截獲變數進行賦值操作的時候 */

-(void

)block_property ;

block();

nslog(

@"array:%@

",array);

}// 賦值操作不需要修飾符

-(void)block_property ;

block();

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

}

4.迴圈引用

//

迴圈引用

-(void

)aroundblock ;

//self z持有block, block有成員變數 array,持有self

strblock(@"

eden");

}-(void

)aroundblock ;

//self z持有block, block有成員變數 array,持有self

strblock(@"

eden");

}

//

weakself 配合strongself 使用,防止在block執行的時候self提前突然被釋放,也有可能閃退

__weak __typeof__(self) weakself =self;

dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default,

0), ^);

}-(void

)dosomething

-(void

)dootherthing

block本身是像物件一樣可以retain,和release。但是,block在建立的時候,它的記憶體是分配在棧(stack)上,而不是在堆(heap)上。他本身的作於域是屬於建立時候的作用域,一旦在建立時候的作用域外面呼叫block將導致程式崩潰。

使用retain也可以,但是block的retain行為預設是用copy的行為實現的,因為block變數預設是宣告為棧變數的,為了能夠在block的宣告域外使用,所以要把block拷貝(copy)到堆,所以說為了block屬性宣告和實際的操作一致,最好宣告為copy。

SG全方位攻略

乙個 3 分球 就可以逆轉戰況,贏得勝利 如果說中鋒是主宰禁區的守護神,那麼得分後衛 sg 的職責就可以說是負責在外圍放冷箭得分。比起身高 速度和跳躍力來說,得分後衛更注重於 需要手感的中長距離投籃 機動靈活的敏捷性 以及 卓越控球的能力 三方面,而在攻擊時,主要是以 3 分線的投籃和擔任快攻的箭頭...

微軟WSFC全方位解析

windows server failover clustering是微軟重要的windows server功能,它為微軟眾多企業級平台提供底層高可用機制,掌握wsfc的概念原理,功能使用,故障排錯將對管理員運維有很大幫助,本系列文章將從wsfc的概念介紹,功能使用,故障排錯,效能優化,wsfc 2...

Unity全方位觀察物體

最近的專案中遇到了乙個需求 要求能全方位並細緻的觀察物體。一開始我的想法是物體旋轉,然後相機能夠縮放視角,於是立馬著手寫出了以下的 float x float y float xspeed float yspeed private void update else if input.getaxis ...