2

このように何かをしない理由はありますか:

[[[CLGeocoder alloc] init] geocodeAddressStr...

この方法の代わりに:

CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressStr...

completionHandler はブロックであり、geocoder 変数はもう使用されていないため、作成しない方がよいでしょう。それとも、メモリ管理部門のことを見落としていますか? ARCを使用しています。

4

3 に答える 3

2

主に読みやすさのために、2番目の例のように常にそのようなものを分解します。コンパイラーがこれらをまったく同じように扱うことは、割り当ての有無にかかわらず、オブジェクトを使用するためにオブジェクトを作成する必要があることを理解しています。意図が何であるかを明確にする名前の変数を見たいと思います。

于 2012-08-12T11:23:35.893 に答える
1

上に示したように、最初の方法を使用できます。メモリ管理ガイドラインには、メモリ内にオブジェクトを作成した場合[... alloc] init]、オブジェクトを解放する責任があると記載されています。ただし、ARCを使用している場合は、何もリリースする必要はありません。電話した後:

[[[CLGeocoder alloc] init] geocodeAddressStr...

作成されたオブジェクトは、必要に応じてシステムによって解放されます。上で述べたように、新しく作成されたオブジェクトを失っても問題はありません。その変数はもう使用されません。

于 2012-08-12T06:39:57.950 に答える
0

ステートメントを 2 行に分ける必要はありません。

--を作成する必要がありCLGeocoderます。これは、呼び出しているインスタンス メソッドです。ただし、おそらくそれを保持する必要はありません。

ARC とブロックは、C と C++ POD と C++ のコピー構築可能な型に加えて、objc 変数をキャプチャして保持することができます。

具体的には、非同期の場合、ブロックはCLGeocoderの実行中に (作成した) をキャプチャして保持しますgeocodeAddressStr...。ブロックが同期されている場合、スタック変数をキャプチャする必要はおそらくありません (ブロック コピーは必要ありません)。変数をそのまま使用して、スレッドのスタックからそれらを参照することができます。

明示的なブロック コピーがいつ必要なのかをプログラマーが認識していない場合、通常、問題が忍び寄ります。

于 2012-08-12T06:20:26.370 に答える