3

虽然我通常在 Xcode 中使用 ARC 模式,但有时,我仍然需要释放一些 temp 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"
}

谁能给我一些线索?

4

2 回答 2

4

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

但是您仍然不应该以这种方式直接访问您的 ivars。虽然 ARC 会做正确的事情(稍后会详细介绍),但它会导致许多其他问题。始终使用除 ininit和之外的访问器dealloc。这应该是:

@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 notes。这与保留和释放无关。专注于对象图。你希望每件事指向什么?ARC 将处理保留计数。

于 2012-10-01T14:40:11.347 回答
2

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

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

于 2012-10-01T14:39:16.497 回答