2017-03-22 9 views
1

iOSのすべてのオブジェクトが自動的に自動解放プールに追加されますか?ARC?いいえ、どれが追加されますか&どちらか1つではありませんか?iOSのすべてのオブジェクトは自動リリースプールに自動的に追加されますか?

例えば:それはその名前'copy/mutableCopy/alloc/new'などの方法により作成されるため、

{ 
    NSString *str = [[NSString alloc] init]; 
    NSString *str2 = [NSString string]; 
} 

+ (NSString *)string { 
    return [[NSString alloc] init]; 
} 

str2プールを自動解放するために追加されます。それで、それは自己によって作成されません。しかし、私はstrが追加されるかどうかわかりませんし、なぜですか?

+0

なぜ知りたいですか? – RunLoop

答えて

-1

答えはNOです。実際には、自動解放プールが追加されますが、メソッド "文字列"のobjです。このよう

// ARC 
{ 
    NSString __strong *str = [[NSString alloc] init]; // STEP A 
    NSString __strong *str2 = [NSString string]; // STEP B 
}// STEP Finish 


+ (NSString *)string { 
    id obj = [[NSString alloc] init]; 
    return obj; 
} 

オブジェクト必見は、それへの強いポインタのポイントを持っている、またはそれは死ぬ.Becauseあなたunderstand.In ARCを助けるかもしれない、オブジェクトが__strong修飾子(デフォルト)を持っています。

ステップA:strはNSStringオブジェクトを作成し、それ自体に強いポイントを作成します。 ステップB:str2は作成されませんが、メソッドストリングのNSStringによって作成されたobj.objであるオブジェクトへの強いポイントです。戻り値が必要なため、自動解放プールに追加されます。そしてstr2のobjへの強力なポイントは、objが自動解放プールによって解放できないため、そこにはまだ強力なポインタポイントがあります。

ステップ終了、str、str2メソッドから、より強力なポインタ。彼らは解放した。 ステップBでは、なぜ自動リリースプールが必要ですか? objを自動解放プールに入れないと、STEP Finishのstrと同様に、コンパイラによって解放されるためです。

「iOSとOS Xのためのプロのマルチスレッドとメモリ管理」のすべてです。

貧しい私の英語を忘れてしまいます。

0

ARCは、自動解放プールに追加されるオブジェクトと、どのオブジェクトが追加されないかについて保証しません。 例のオブジェクトのもARCの下の自動解放プールに追加されていない可能性が非常に高いです。

関連する問題