0

私は ARC を使用しており、autoreleasepool がその中のすべての要素にリリースを送信することを知っています。次の例を考えてみましょう。

-(NSString*)someMethod{

    NSString *string1=@"sample text inside string 1"; // string1 add to main autorelease pool
    NSString *string2=[[NSString alloc] init];        // string2 retain count is 1

    string2=@"sample text inside string 2";           // just assigning

    return string1;

}

-(void)viewDidLoad{

    NSString *returnedString=[self someMethod];

}

1.私の質問は、someMethodでstring2を完全に解放するにはどうすればよいですか?

2. viewDidLoad メソッドから string1 を完全に解放するにはどうすればよいですか?

注:ARCを使用しています

someMethod で @autoreleasepool を使用すると、string1 と string2 の両方が破棄されると思います。そうじゃない?

そして、someMethod で @autoreleasepool を使用した場合の効果はどうなりますか

-(NSString*)someMethod{

    @autoreleasepool{

    NSString *string1=@"sample text inside string 1"; // string1 add to main autorelease pool
    NSString *string2=[[NSString alloc] init];        // string2 retain count is 1

    string2=@"sample text inside string 2";           // just assigning

    }
    return string1;

}
4

4 に答える 4

2

初めに、

NSString *string2=[[NSString alloc] init];
string2=@"sample text inside string 2";  

string2 自体はオブジェクトではありません。オブジェクトへのポインタです。したがって、ここではオブジェクトを作成し、それへのポインターを取得して、すぐに別の文字列へのポインターに置き換えます。ARC を使用しなかった場合、ここでメモリ リークが発生します。詳細については、@Anoop Vaidya の回答をご覧ください。

ご質問について: ARC を使用すると、コンパイラは自動的にオブジェクトを追跡し、使用されなくなったら解放します。したがって、手動でリリースする必要はありません。nil へのポインターを割り当てることもできますが、思い出すとすぐに必要ではなくなります。

string1 が autorelease スコープ内で宣言されているため、2 番目の例のコードはコンパイルされません。実際、この @autorelease は、内部に autoreleased オブジェクトを作成しないため、何の違いもありません。

この質問には、ARC での自動解放プールの使用に関する詳細が含まれています。また、 Appleの公式ドキュメントはおそらく私がこれまでに見た中で最高のものです。長すぎず、すべてを詳細に説明しています:)

于 2013-05-01T10:18:36.467 に答える