当块被声明为assign时发生了什么

时间:2017-08-03 06:35:30

标签: ios objective-c

我有一段时间没有调整块。今天我在Objective-C中找到了一个关于块的访谈问题:

给出以下代码:

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIButton *button;
- (IBAction)buttonClick:(id)sender;

@property(nonatomic, assign) void(^block)();

@end

- (void)viewDidLoad {
    [super viewDidLoad];
    int value = 10;
    void(^blockC)() = ^{
        NSLog(@"just a block === %d", value);
    };

    NSLog(@"%@", blockC);
    _block = blockC;

}

- (IBAction)buttonClick:(id)sender {
    NSLog(@"Log:%@", _block);
}

会发生什么?

这里是输出和一些调试值:

如果我在viewDidLoad()的末尾添加断点,则输出结果为:

2017-08-03 14:28:49.209 TestApp[23692:1211863] <__NSMallocBlock__: 0x600000055210>
(lldb) po _block
0x00000001026b86c0

点击按钮并在NSLog(@"Log:%@", _block);处中断后,显示:

2017-08-03 14:30:57.948 TestApp[23692:1211863] Log:{(
    _UILayoutGuide:0x7fc40b70cd10.minY{id: 16}
)}
(lldb) po _block
0x0000000000000003

所以我知道,因为在blockC之后viewDidLoad()被释放,_block应该指向脏字段并导致内存泄漏或堆栈溢出。但令我困惑的是,首先,在viewDidLoad()中,为什么NSLog输出为<__NSMallocBlock__: 0x600000055210>,但_block值为0x00000001026b86c0?这是否意味着0x00000001026b86c0上指向<__NSMallocBlock__: 0x600000055210>的指针是什么?

其次,当我们点击按钮时,为什么_block变为0x0000000000000003?每次都不是这个值,有时可能是0x0000000000000001甚至是其他大数字(或地址值)。另外NSLog输出怎么可以

  

日志:{(           _UILayoutGuide:0x7fc40b70cd10.minY {id:16}?       )}

有人可以帮助解释整个过程吗?提前谢谢!

0 个答案:

没有答案