このように何かをしない理由はありますか?
[[[CLGeocoder alloc] init] geocodeAddressStr...
この方法の代わりに:
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressStr...
completionHandlerはブロックであり、ジオコーダー変数はもう使用されていないため、作成しない方がいいかもしれません。または、メモリ管理部門で見落としているのでしょうか?ARCを使用しています。
回答:
回答№1は0ステートメントを2行に分ける必要はありません。
あなたが作成する必要があります CLGeocoder
-これは、呼び出しているインスタンスメソッドです。ただし、おそらくする必要はありません つかまって.
ARCおよびブロックは、CおよびC ++ PODおよびC ++コピー構築可能型に加えて、objc変数をキャプチャおよび保持できます。
具体的には、ブロックは、非同期の場合、キャプチャして保持します CLGeocoder
(作成した)の実行中 geocodeAddressStr...
。ブロックが同期されていれば、おそらくスタック変数をキャプチャする必要はありません(ブロックコピーは必要ありません)-変数をそのまま使用して、スレッドのスタックからそれらを参照することができます。
プログラマが明示的なブロックコピーが必要であることに気付いていない場合、通常問題は忍び込みます。
回答№2については2
私はいつもあなたの2番目のようなものを分解しますたとえば、主に読みやすさのためです。コンパイラは、これらを割り当てるかどうかにかかわらず、オブジェクトを作成して使用するのとまったく同じように処理することを理解しています。むしろ、意図が何であるかが明確になるような名前の変数を見てみたいです。
回答№3の場合は1
上記の最初の方法を使用できます。 メモリ管理のガイドラインでは、メモリ[... alloc] init]にオブジェクトを作成した場合、そのオブジェクトを解放する責任があります。ただし、ARCを使用している場合、「リリースする必要はありません。呼び出し後:
[[[CLGeocoder alloc] init] geocodeAddressStr...
作成されたオブジェクトは、必要に応じてシステムによって解放されます。 新しく作成されたオブジェクトを失うことは、変数がこれ以上使用されないことを上で述べたように問題ではないはずです。