IOS面試題(block相關(guān)) --- block變量截取

OC面試題目合集地址

先了解 block 截獲變量

  • 基本數(shù)據(jù)類型局部變量: 截獲其值
  • 對象類型局部變量: 連同所有權(quán)修飾符一起截獲
  • 局部靜態(tài)變量: 指針形式截獲
  • 全局變量: 不截獲
  • 靜態(tài)全局變量: 不截獲

問題1: 看例子回答

    int test1 = 2;
    
    int(^Block)(int) = ^int(int n) {
        
        return n * test1;
    };
    
    NSLog(@"result: %d", Block(6));

答案

12

block對于基本數(shù)據(jù)變量截獲是截獲其值 , 那么內(nèi)部block截獲基本數(shù)據(jù)類型2, 進(jìn)行:
6 * 2 = 12


驗(yàn)證


問題2: 看例子回答

- (void)blockTest1 {
    
    int test1 = 2;
    
    int(^Block)(int) = ^int(int n) {
        
        return n * test1;
    };
    
    test1 = 3;
    
    NSLog(@"result: %d", Block(6));
}
例子

答案

12

相比問題1, block之后多加了一個對基本數(shù)據(jù)類型的賦值, 但是呢不要被迷惑了,
block對于基本數(shù)據(jù)變量截獲是截獲其 "值", 要深刻理解這句話. 簡單來說, 再block之前基本數(shù)據(jù)類型是什么值, 直接寫死在這個block里面, 不會變跟后面賦值個3沒關(guān)系了, 可以理解成這樣:

- (void)blockTest1 {
    
    int test1 = 2;
    
    int(^Block)(int) = ^int(int n) {
        // 就是2 不會變
        return n * 2;
    };
    
    test1 = 3;
    
    NSLog(@"result: %d", Block(6));
}

那么 6 * 2 = 12

驗(yàn)證


問題3: 看例子回答

- (void)blockTest1 {
    
    static int test1 = 2;
    
    int(^Block)(int) = ^int(int n) {
        
        return n * test1;
    };
    
    test1 = 3;
    
    NSLog(@"result: %d", Block(6));
}

答案

18

留意下這里 static int test1 = 2; 是局部靜態(tài)變量, 局部靜態(tài)變量block底層是以指針形式存放的, 后面有test1 = 3, 指針指向3

那么 6 * 3 = 18

驗(yàn)證


問題4: 看例子回答

static int test1 = 2;

- (void)blockTest1 {
    
    int(^Block)(int) = ^int(int n) {
        
        return n * test1;
    };
    
    test1 = 3;
    
    NSLog(@"result: %d", Block(6));
}

答案

18

全局變量靜態(tài)全局變量 block 不截獲其內(nèi)容, 通俗點(diǎn)說調(diào)用block時候, 當(dāng)時變量是什么取什么值, 那么

6 * 3 = 18

驗(yàn)證


問題5: 看例子回答打印結(jié)果

    NSMutableArray *arr = [NSMutableArray array];
    
    void(^Block)(void) = ^{
        [arr addObject:@"123"];
    };
    
    [arr addObject:@"456"];
    
    Block();
    
    NSLog(@"%@", arr);

答案

[ 456, 123 ]

對象類型局部變量是連同所有權(quán)修飾符一起截獲, 這里其實(shí)block存放的是NSMutableArray *arr指針, 后面數(shù)組先添加了"456", 指針對象指向是["456"], 再進(jìn)行block操作, 即 ["456"]插入一個新元素"123", 結(jié)果 [ 456, 123 ]

驗(yàn)證


問題6: 看例子回答打印結(jié)果

    __block int test1 = 2;
    
    int(^Block)(int) = ^int(int n) {
        
        return n * test1;
    };
    
    test1 = 3;
    
    NSLog(@"result: %d", Block(6));

答案

18

通俗講, 其實(shí)__block修飾數(shù)據(jù)型, 在底層已經(jīng)變成對象 (實(shí)際上是一個結(jié)構(gòu)體), 不是像通?;緮?shù)據(jù)類型一樣存的那個值. 那么當(dāng)后續(xù) test1 有變化時候, 內(nèi)部對象(結(jié)構(gòu)體中__forwarding的指針)會指向新變化值, 即

3 * 8 = 18

驗(yàn)證
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容