我有一段时间没有调整块。今天我在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}? )}
有人可以帮助解释整个过程吗?提前谢谢!