3

私は通常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"
}

誰かが私にいくつかの手がかりを与えることができますか?

4

2 に答える 2

4

ARCがこれを処理します。手動でリリースする理由はありませんaaそれでもオブジェクトを指しているので、そうすることはとにかく正しくありません。

ただし、この方法でivarに直接アクセスしないでください。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が保持カウントを処理します。

于 2012-10-01T14:40:11.347 に答える
2

a = nil;あなたがやろうとしていることをするべきです。

ただし、作成したオブジェクトはによって割り当てられb、保持されbます。

于 2012-10-01T14:39:16.497 に答える