0
点赞
收藏
分享

微信扫一扫

iOS block变量的获取机制总结

其实block其实是一个对象,因为它是有isa指针的,另外就是它是一个带自动变量的匿名函数。了解了这个那么接下来我大概总结一下:记住就行了。

1.局部变量

block截取局部变量的只是截获了它的值。看代码的输出就知道了:

void blockTest()
{
    int num = 1;
    void (^block)(void) = ^{
        NSLog(@"%d",num);
    };
    num = 2;
    block();
}

int main(int argc, char * argv[]) {
    @autoreleasepool {
        blockTest();
    }
}

输出的num结果是1,并不是2.也就是说只是一个值传递。

2.static修饰的变量

block截获的是变量的指针,看代码输出:

void blockTest()
{
    static int num = 1;
    void (^block)(void) = ^{
        NSLog(@"%d",num);
        num = 3;
    };
    num = 2;
    block();
    NSLog(@"%d",num);
}
int main(int argc, char * argv[]) {
    @autoreleasepool {
        blockTest();
    }
}

输出的结果是:2和3.因为截获的是指针并不是值,也就是是指针传递。

3.全局变量

block并不会捕获到全部变量不管是全局变量还是全局static变量都是一样的,看代码:

int a = 1;
static int b = 2

int main(int argc, char * argv[]) {
    @autoreleasepool {
        void blockTest()
		{
    		NSLog(@"%d====%d",a,b);
    
		}
        a = 10;
    	b = 20;
    }
}

结果是:全局变量a和静态全局变量b 获取到的都是最新的值10和20。


举报

相关推荐

0 条评论