arc 下 [[[block copy] copy] copy] 有没有问题?

测试代码

typedef void (^blk)(void);
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        __weak blk weakBlk = nil;
        {
            __block int a = 1;
            
            blk obj = ^{a++;};
            blk obj2 = [[[obj copy] copy] copy];
            weakBlk = obj;
            NSLog(@"before release %@", obj2);
            NSLog(@"%@", weakBlk);
        }
        
        NSLog(@"%@", weakBlk);
    }
    return 0;
} 

输出结果

2017-09-11 10:44:16.403783+0800 BlockTest[29910:11379291] before release <__NSMallocBlock__: 0x1004033a0>
2017-09-11 10:44:16.403949+0800 BlockTest[29910:11379291] <__NSMallocBlock__: 0x1004033a0>
2017-09-11 10:44:16.403968+0800 BlockTest[29910:11379291] (null)

结论:it's ok.

ps:retainCount 对于block对象真的不准确,不论在arc , 还是mrc下,持有block的对象是几个,输出的retainCount总是不会超过1。

最后提两个问题

  1. __block变量转换后的结构体为什么需要带有 __forwarding的成员变量? 2. 为什么不是在Block结构体中追加一个自动变量指针类型的变量?

你可能感兴趣的:(arc 下 [[[block copy] copy] copy] 有没有问题?)