避免 Block 中的强引用循环,我可以简单地这样做吗
Avoid strong reference cycle in Block, can I simply do this
我正在看书,上面写着:
要打破强引用循环,您可以在块外声明一个指向自身的 __weak 指针。然后你可以在块内使用这个指针而不是 self:
__weak BNREmployee *weakSelf = self; // a weak reference
myBlock = ^{
NSLog(@"Employee: %@", weakSelf);
};
块对BNREmployee实例的引用现在是弱引用,强引用循环被打破。
但是,由于引用是弱引用,self 指向的对象可能会在块执行时被释放。
您可以通过在块内创建对 self 的强本地引用来消除这种风险:
__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
。如果该块由同一对象的 属性 保留,则您有一个保留循环。
我正在看书,上面写着: 要打破强引用循环,您可以在块外声明一个指向自身的 __weak 指针。然后你可以在块内使用这个指针而不是 self:
__weak BNREmployee *weakSelf = self; // a weak reference
myBlock = ^{
NSLog(@"Employee: %@", weakSelf);
};
块对BNREmployee实例的引用现在是弱引用,强引用循环被打破。 但是,由于引用是弱引用,self 指向的对象可能会在块执行时被释放。 您可以通过在块内创建对 self 的强本地引用来消除这种风险:
__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
。如果该块由同一对象的 属性 保留,则您有一个保留循环。