0

保存された変数を直接初期化するのではなく、最初にローカル変数を作成することの利点を誰かに教えてもらえないかと思いました。以下の例を参照してください。

Example.h

NSString *exampleString;

@property (nonatomic, retain) NSString *exampleString;

Example.m

@synthesize exampleString;

方法1(直接初期化)

self.exampleString = [NSString stringWithString:@"Example"];

方法2(ローカル初期化)

NSString *example = [NSString stringWithString:@"Example"];
self.exampleString = example;
[example release];

コード内で両方のタイプを使用しましたが、直接の違いはわかりませんが、ほとんどのコーディング例を見ると、方法2が使用されています。2つの間に実際的な違いがあるかどうか疑問に思いました。

高度なおかげで、エリオット

4

3 に答える 3

1

一度しか使っていない場合は考えられません。実際、あなたの例は、それが存在する場合、誰かがそれを過剰にリリースしたくなるかもしれないという問題を指摘しています。:)

実際、self.exampleString = @"Example";どちらよりも読みやすいです。

于 2012-05-14T13:58:29.597 に答える
0

example方法2では、変数を作成も保持もしていないため、変数を解放しないでください。これを見てください: https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

この問題を除いて、2つの方法に違いはありません。方法1は、余分な変数が必要ないため、私の意見ではよりクリーンです。

于 2012-05-14T13:55:27.010 に答える
0

2番目の方法は間違っています!すでに自動リリースされたオブジェクトをリリースしています。initまたはretainを呼び出さなかったため、サンプル文字列を所有していません。その後、リリースする必要はありません。リリースしないと、アプリがクラッシュする可能性があります。2番目の方法の正しいバージョンは次のとおりです。

NSString *example = [[NSString alloc] initWithString:@"Example"];
self.exampleString = example;
[example release];

これと最初のメソッドの違いは、ここでは自動解放されたオブジェクトがないことです。文字列を初期化し、インスタンス変数に割り当て(および保持)してから解放します。最初のメソッドでは、stringWithStringは、将来のある時点(通常はサイクルの終わり)にリリースされる自動リリースされたオブジェクトを作成します。それまではメモリ内にあります(そしてそれを無駄にします)。したがって、特に(多くの)大きなオブジェクトの場合は、これを避ける必要があります。

于 2012-05-14T13:56:09.447 に答える