1
NSString * str;  ///< Global string.

/// Some class method
-(void) foo:(NSString*) localStr
{
    str = [[NSString alloc] initWithString:localStr];
}

私はARCを使用しているので、nilでない場合、NSString*strの割り当てを手動で解除することはできません。

ARCはコンパイル時に実行されることを理解しているため、fooが2回呼び出された場合、NSStringを割り当てる前にNSStringの割り当てを解除するかどうかはわかりません。

4

2 に答える 2

3

ARCを使用すると、他の参照のない文字列を指している場合に自動的に割り当てが解除され、新しい文字列オブジェクトに設定されますstr新しい値を設定するときに、古い文字列の管理について心配する必要はありません。

ARCは自動参照カウントの略で、適切なタイミング(の値を変更したときなど)に呼び出しretainを処理します。実際、これらの関数を手動で呼び出すことはできなくなりましたが、同じことが「舞台裏」で行われています。releasestr

余談ですが、「nilでない場合、NSString*strの割り当てを手動で解除することはできません」と言います。ARCを使用するときにオブジェクトの割り当てを解除するために通常行うことは、オブジェクトへのすべての参照をに設定することnilです。したがって、この場合、文字列の割り当てを解除する場合(それが文字列への唯一の参照であると想定)、単に: に設定するstr必要があります。ただし、前述したように、新しい値を設定するためにこれを行う必要はないことに注意してください。ARCは、両方を同時に処理できるほど賢いです。strnilstr = nil;str

もう1つ余談ですが、次のコード行があります。

str = [[NSString alloc] initWithString:localStr];

実際にコピーを作成する場合は、これを次のように置き換えることができます。

str = [localStr copy];

少し短くてわかりやすいです。多くの場合、実際のコピーは必要なく、既存の文字列への参照を保持できるため、次を使用できます。

str = localStr;
于 2013-01-30T01:14:03.830 に答える
1

文字列がまだ作成されていない場合にのみ文字列を作成しようとしている場合は、次のようにすることができます。

NSString * str = nil;  ///< Global string.

/// Some class method
-(void) foo:(NSString*) localStr
{
    if(!str)//only create if it is not already created
    {
        str = [[NSString alloc] initWithString:localStr];
    }
}

新しい文字列を割り当てる前に古い文字列を削除しようとすると、新しい文字列を割り当てて関数スコープを離れると、魔法のように削除されます。文字列を明示的に「解放」する必要はありません。

プログラムに文字列が不要であることを明示的に伝えたい場合は、次のようにします。

str = nil;

これにより、文字列への str の強力なポインターが削除されます。スコープ内に多くの (または非常に大きな) 文字列を作成している状況でない限り、通常は上記で問題ありません。ただし、 @autoreleasepool ブロッ​​クを調べて、メモリを強制的に解放することができます。

于 2013-01-30T01:23:58.960 に答える