对象在ARC下未被删除



当第二个对象被dealloc时,在第二个对象中创建的对象不会被dealloc,除非我在dealloc中将指针设置为nil,这似乎是不对的。

我认为ARC应该在对象被deallod时默认将所有指针设置为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++和对象做任何事情。

谢谢。

这绝对应该以您期望的方式工作。您可能无意中在代码中做了一些混淆或从示例中剪切的事情。为了演示,您可以将下面的代码保存到某个文件中,例如,arc_tst.m,编译并从终端运行它。您将看到它打印出所有预期的日志语句,然后以释放两个对象结束。这些对象与您在这里发布的示例代码中的建模完全相同(表明问题很可能出现在您实际代码的其他部分)。

要编译它,假设您已将其命名为arc_tst.m,请切换到文件保存的目录,然后输入以下命令:

$ clang -fobjc-arc -o arc_tst arc_tst.m -framework foundation
$ ./arc_tst

arc_tst.m

// build with: clang -fobjc-arc -o arc_tst arc_tst.m -framework foundation
#import <Foundation/Foundation.h>
@class Obj1, Obj2;
@interface Obj1 : NSObject
{
  Obj2* _obj2;
}
@end
@interface Obj2 : NSObject
{
}
@end
@implementation Obj1
- (id)init
{
  if( (self = [super init]) )
  {
    _obj2 = [[Obj2 alloc] init];
  }
  return self;
}
- (void)dealloc
{
  NSLog(@"Obj1 Dealloc");
}
@end
@implementation Obj2
- (id)init
{
  if( (self = [super init]) )
  {
  }
  return self;
}
- (void)dealloc
{
  NSLog(@"Obj2 Dealloc");
}
@end
int main (int argc, char const *argv[])
{
 @autoreleasepool {
  Obj1* obj = [[Obj1 alloc] init];
  NSLog(@"after alloc, have obj1: %@", obj);
  sleep(2);
  NSLog(@"after sleep, have obj1: %@", obj);
  obj = nil; // force ARC to trash obj
  NSLog(@"after nil on obj1, about to exit");
 }
 return 0;
}

最新更新