3

現在、実際の作業を開始する前に、いくつかのことを把握するために ARC をいじっています。私はこのコードをセットアップしました:

NSNumber* n = [[NSNumber alloc] initWithInt:3];
__weak NSNumber* weakN = n;
n = nil;
NSLog(@">>>: %@ %@", n, weakN);

n = nil であるため、n と weakN は nil であると予想していました。私の目にリリースをトリガーする必要がありますか? 残念ながらそうではありません。出力は ">>>: (null) 3" です。ここで何が欠けていますか?

もう1つのことは、私が確信していることですが、以下のコードは、arcを開始するときに苦労していました。

__weak NSNumber* weakN2 = [[NSNumber alloc] initWithInt:3];
NSLog(@">>>: %@", weakN2);

オブジェクトへの強い参照がないため、アークは初期化の直後にオブジェクトを解放するため、同様のコードでいくつかの問題が発生したと確信しています。残念ながら、上記の出力は ">>>: 3" です。

この点について明確な説明が得られることは素晴らしいことです。ここで明らかに何かが欠けています!

敬具、マイケル

4

3 に答える 3

3

kevbohが言ったことに加えて、NSNumberのような単純な不変のFoundationオブジェクトへの弱参照を作成することも無意味です。パフォーマンス上の理由から、Foundationは、まったく新しいオブジェクトを作成するのではなく、キャッシュされたオブジェクトを提供する場合があります。また、現在そうでない場合は、将来のリリースで使用される可能性があります。

[[NSNumber alloc] initWithInt:3]結果として、あなたが何を考えようとも、あなたはおそらく、によって返されるオブジェクトの唯一の所有者ではないということです。

于 2012-05-20T00:22:10.400 に答える
3

さて、あなたはこれをテストするために悪いオブジェクトを選んだだけです。NSString (または他のほとんどのオブジェクト) でそれを行うと、期待される結果が得られます。

NSString* n = [[NSString alloc] initWithFormat:@"3"];
__weak NSString* weakN = n;
n = nil;
NSLog(@">>>: %@ %@", n, weakN);
// Output is (null) (null)

__weak NSString* weakN2 = [[NSString alloc] initWithFormat:@"3"];
NSLog(@">>>: %@", weakN2);
// Output is (null)

クラスが作成された番号をキャッシュしているため、NSNumber の動作が発生し、実際にはまだ有効です。コードの一部としてコンパイルされた文字列定数を使用すると、同じ動作が発生します。(のようにNSString* n = @"3";)

于 2012-05-20T02:40:17.337 に答える
1

n = nilであるため、nとweakNはnilであると予想しました。私の目にリリースをトリガーする必要がありますか?残念ながらそうではありません。出力は>>>:(null)3"です。ここで何が欠けていますか?

ARCはそのようには機能しません。オブジェクトの所有権は非決定的です。ARCは、関数が終了するまでそれを保持している可能性があります。所有権が発生することを意図している場合は、deallocが発生することを期待せず、代わりに強/弱参照を使用する必要があります。

于 2012-05-19T23:47:24.567 に答える