gpt4 book ai didi

objective-c - 奇怪的 ARC 问题没有在 UIView 子类中释放 ivar

转载 作者:可可西里 更新时间:2023-11-01 04:42:35 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Why is object not dealloc'ed when using ARC + NSZombieEnabled

我目前在一个项目中遇到了一个非常奇怪的问题。简而言之,我有 ViewA,它拥有 ViewB(strong 属性)。 ViewA 在其初始化程序中创建其 ViewB。这两个对象都是 UIView 的子类。

我已经覆盖了两者中的 dealloc 并放置了一个日志行和一个断点以查看它们是否被命中。似乎 ViewAdealloc 被命中但 ViewB 没有。但是,如果我在 ViewAdealloc 中放入一个 self.viewB = nil 然后它命中。

基本上是这样的:

@interface ViewA : UIView
@property (nonatomic, strong) ViewB *viewB;
@end

@implementation ViewA

- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.viewB = [[ViewB alloc] initWithFrame:self.bounds];
[self addSubview:self.viewB];
}
return self;
}

- (void)dealloc {
//self.viewB = nil; ///< Toggling this commented/uncommented changes if ViewB's dealloc gets called.
NSLog(@"ViewA dealloc");
}

@end

我不明白的是为什么 nil-ing viewB 会有所不同。如果 viewB 上有其他内容,那么无论我是否在此处将其置零,都应该没有什么区别。它不应该对 ARC 添加的版本数量产生影响。

我似乎还不能在最小的测试用例中重现它,但我正在努力。不幸的是,我无法发布我看到的实际代码。不过,我不认为这是一个问题,因为更重要的是,将其设为 nil 应该不会有什么不同,我对此感到困惑。

任何人都可以看到我忽略的任何内容或提供有关在哪里寻找调试此问题的建议吗?

更新:

我发现了问题。似乎只有当 NSZombieEnabled 设置为 YES 时才会出现问题。好吧,这完全是疯了,肯定是一个错误。据我所知,僵尸不应该影响它的工作方式。对象仍应通过 dealloc 方法。更重要的是,如果我在 ViewAdealloc 中将 viewB 设为 nil,它还能工作,这真是太疯狂了。

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