ARC下没有删除对象

时间:2012-01-01 22:21:57

标签: objective-c automatic-ref-counting objective-c++

第二个对象在第二个对象被释放时没有被释放,除非我在dealloc中将指针设置为nil,这似乎不正确。

我认为当对象被dealloc'd时,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 ++和对象做任何事情。

感谢。

1 个答案:

答案 0 :(得分:1)

这绝对应该按照您期望的方式工作。你可能在代码中偶然做了一些事情,你已经从你的例子中混淆或剪裁了。为了演示,您可以将下面的代码保存到某个文件,例如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;
}