1

重複の可能性:
Objective-C で ARC を使用する場合、AutoRelease は冗長ですか?

私は Objective C を初めて使用し、そのメモリ管理を理解しています。強い変数の振る舞いを理解するのに本当に行き詰まりました。以下は、本当に私を混乱させるスニペットです。次の方法があり、ARCを使用しています。

-(void) watchStrongVariable {
    MyClass * myobj = [self getMyClassObject];
    // ...
}

-(MyClass *) getMyclassObject{
    return [[[MyClass alloc] init] autorelease];
}

MyClass2 行目では、オブジェクトをローカル変数に割り当てていますmyobj。すべてのローカル変数はデフォルトで強力であり、強力は保持に似ていることを読みました。したがって、上記の場合、私の仮定はmyobj保持され、メソッドに所有されてwatchStrongVariableいますが、呼び出しによって明示的にmyobj解放しないでください。同じパターンに従う多くのプログラムを見ましたが、解放メッセージが送信されませんローカル変数。上記の場合に のリリースが必要ない理由を誰かが説明してくれますか?myobj[myobj release]myobj

4

3 に答える 3

2

ARCを使用している場合は、保持、解放、または自動解放を使用できません。これは、ARCが自動的に処理するためです。あなたは単にこれを行うことができます:

- (MyClass *)getMyclassObject {
    return [[MyClass alloc] init];
}

コンパイラーが自動解放呼び出しを追加します。しかし、ARCの要点は、これについてあまり考える必要がなくなったことです。

于 2012-09-15T19:25:27.900 に答える
2

ARCを使用する場合は、何も自動リリースする必要はありません。実際、これはコンパイラエラーを生成します。

したがって、ARCを使用する場合、これは正しいでしょう。

-(MyClass *) getMyclassObject{
    return [[MyClass alloc] init];
}
于 2012-09-15T19:25:41.923 に答える
2

retain1つは、明示的に使用することはできません。releaseまたautorelease、ARCの場合、コンパイラはそれを許可しません。

2つ目は、この場合は単純なものであるため、これについてまったく考える必要はありません。強力な変数がスコープ外になると、releaseメッセージと同等になります。したがって、これがARCでどのように機能するかは次のとおりです。

- (void)watchStrongVariable
{
    MyClass *myobj = [self myClassObject]; // implicit retain-on-assignment
    // implicit release-on-end-of-scope
}

- (MyClass *)myClassObject
{
    return [[MyClass alloc] init]]; // implicit release-after-return
}

コーディングスタイルに関するアドバイス。1つは、ゲッター名には使用しないでください。getXXXXこれは、UIColorのgetRed:green:blue:alpha:メソッドのように、出力アーティクルを持つ(つまり、書き込まれるポインターを受け入れる)メソッド用に予約されています。2つ目は、関数の場合、開始中括弧は別の行にあり、ポインター型を示すアスタリスクは、型ではなく変数名と衝突する必要があります。ですから、書くのが最善であり、そうではint *i;ありませint* i;int * i;

于 2012-09-15T20:56:28.423 に答える