【发布时间】:2012-01-31 12:44:10
【问题描述】:
当第二个对象被解除分配时,在第二个对象中创建的对象不会被解除分配,除非我在解除分配中将指针设置为 nil,这似乎不正确。
我认为 ARC 应该在对象被释放时默认将所有指针设置为 nil,从而释放所有拥有的对象。
这是我的代码(只是核心):
@interface Obj1 : NSObject
{
Obj2 *obj2;
}
@interface Obj2 : NSObject
{
}
@implementation Obj1
-(void)dealloc
{
obj2 = nil; // <--- This is needed to get obj2 to be dealloc'd.
NSLog(@"Obj1 dealloc");
}
-(id)init
{
if ((self = [super init]) == nil)
return nil;
obj2 = [[Obj2 alloc] init];
return self;
}
@end
@implementation Obj2
-(void)dealloc
{
NSLog(@"Obj2 dealloc");
}
-(id)init
{
if ((self = [super init]) == nil)
return nil;
return self;
}
@end
我做错了吗?我读过的所有内容都说这应该有效。没有其他人持有 obj2 ,因为将其设置为 nil 会释放它。我已经尝试了带有和不带有 dealloc 函数的代码,以防万一它搞砸了,我得到了相同的结果。
有问题的文件正在编译为 obj-c++,但我没有对 c++ 和对象做任何事情。
谢谢。
【问题讨论】:
-
好的,我找到了问题。我设置了启用僵尸对象。我很惊讶如果它没有设置为 nil,它会阻止对象被删除。我认为 Zombie Objects 只是在对象被删除后放置在该对象的位置上。如果它从不调用 dealloc,那可能会导致其他一些更大的问题。
标签: objective-c automatic-ref-counting objective-c++