我正在读这本书,上面写着:为了打破强引用循环,您在块外声明一个指向self的__weak指针。然后你可以在块内使用这个指针,而不是自己:
__weak BNREmployee *weakSelf = self; // a weak reference
myBlock = ^{
NSLog(@"Employee: %@", weakSelf);
};
块对BNREemployee实例的引用现在是弱引用,并且强引用循环被打破。但是,由于引用较弱,因此在执行块时可能会释放自身指向的对象。您可以通过在区块内创建对自身的强本地引用来消除这种风险:
__weak BNREmployee *weakSelf = self; // a weak reference
myBlock = ^{
BNREmployee *innerSelf = weakSelf; // a block-local strong reference
NSLog(@"Employee: %@", innerSelf);
};
为什么我不能简单地做以下事情?
myBlock = ^{
BNREmployee *innerSelf = self; // a block-local strong reference
NSLog(@"Employee: %@", innerSelf);
};
或
BNREmployee *strongSelf = self;
myBlock = ^{
BNREmployee *innerSelf = strongSelf; // a block-local strong reference
NSLog(@"Employee: %@", innerSelf);
};
您的替换块直接引用self
,因此只要块存在,ARC就会保留self
。如果块由同一对象的特性保留,则存在保留循环。