gpt4 book ai didi

objective-c - 为什么这段代码会在 ARC 下泄露? (一个 __weak 实例变量)

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:57 26 4
gpt4 key购买 nike

我正面临一个奇怪的漏洞。以下 Car 类的对象永远不会被释放。

但是,如果我摆脱实例变量 _unsafe_self 而是在 init 方法中声明(并像以前一样分配给)该变量,泄漏就会消失。

这可能是什么原因造成的?我认为 __weak 总是弱的,无论它是否是实例变量。

@interface Car : NSObject
@end

@implementation Car {
id _obs;
__weak Car *_unsafe_self;
}

- (id)init {
if (!(self = [super init]))
return nil;

_unsafe_self = self;

_obs = [[NSNotificationCenter defaultCenter]
addObserverForName:NSWindowDidMoveNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
NSLog(@"hello %@", _unsafe_self);
}];

return self;
}

- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:_obs];
}
@end

最佳答案

_unsafe_selfself->_unsafe_self 相同,因此 block 在

_obs = [[NSNotificationCenter defaultCenter]
addObserverForName:NSWindowDidMoveNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
NSLog(@"hello %@", _unsafe_self);
}];

捕获 self,导致一个保留周期,阻止 self 被释放。

这不会导致保留周期:

__weak Car *weakSelf = self;
_obs = [[NSNotificationCenter defaultCenter]
addObserverForName:NSWindowDidMoveNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
NSLog(@"hello %@", weakSelf);
}];

使用属性 self.unsafe_self 会使代码中的这一点更加明显,但是已经有足够多的“属性与 ivar”问答 :-)

关于objective-c - 为什么这段代码会在 ARC 下泄露? (一个 __weak 实例变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com