如何在ARC中释放对象

时间:2012-10-01 14:36:56

标签: objective-c automatic-ref-counting

虽然我在Xcode中通常使用ARC模式,但有时候,我仍然需要释放一些临时obj。我不知道如何使用它。这是一个例子:

TestViewController.h文件

TestViewController
{
    A* a;
    A* b;
}

TestViewController.m文件

viewDidLoad()
{
   a = [[A alloc] init];
   b = a;

   [a release];
   // I want to release a here, but when I use [a release], there will be a build error. "release is unavailable: not available in ARC mode"
}

有人能给我一些线索吗?

2 个答案:

答案 0 :(得分:4)

ARC将为您解决这个问题。没有理由手动释放a。这样做无论如何都是不正确的,因为a仍然指向对象。

但你仍然不应该以这种方式直接访问你的ivars。虽然ARC会做正确的事情(在一秒钟内更多),但它会导致许多其他问题。始终使用除initdealloc之外的访问者。这应该是:

@interface TestViewController
@property (readwrite, strong) A* a;
@property (readwrite, strong) A* b;
@end

@implementation TestViewController
- (void)viewDidLoad {
    self.a = [[A alloc] init];
    self.b = self.a;
}

至于ARC在您的代码中实际执行的操作,它将插入所需的保留字符:

A* tmp = [[a alloc] init];
[a release];
a = tmp;
A* tmp2 = [a retain];
[b release];
b = tmp2;

如果您不希望a指向旧值,请将其设置为nil,如Michael所说。这与保留和发布无关。专注于对象图。你希望每件事指向什么? ARC将负责保留计数。

答案 1 :(得分:2)

a = nil;应该做你想做的事。

但是,您创建的对象将被分配到b并由b保留。