2

有没有理由不这样做:

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

而不是这种方式:

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

因为completionHandler 是一个块,并且不再使用geocoder 变量,所以最好不要创建它。还是我忽略了内存管理部门的事情?我正在使用ARC。

4

3 回答 3

2

我总是像你的第二个例子那样分解这些东西,主要是为了可读性。我的理解是,无论您是否分配它,编译器都会将它们视为完全一样,因为它必须创建对象才能使用它。我更愿意看到变量的名称可以清楚地表明意图是什么。

于 2012-08-12T11:23:35.893 回答
1

您可以使用上面显示的第一种方法。内存管理指南规定,如果您在内存 [...alloc] init] 中创建了一个对象,您应该负责释放它。但是,如果您使用的是 ARC,则无需发布任何内容。调用后:

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

创建的对象将在必要时由系统释放。丢失新创建的对象应该没有问题,正如您在上面所说的那样,将不再使用该变量。

于 2012-08-12T06:39:57.950 回答
0

无需将语句分隔成两行。

您将需要创建CLGeocoder-- 这是您正在调用的实例方法。但是,您可能不需要坚持下去

ARC 和块能够捕获和保留 objc 变量——除了 C 和 C++ POD 以及 C++ 可复制构造类型。

具体来说,如果是异步的,则该块CLGeocodergeocodeAddressStr.... 如果块是同步的,那么它可能不需要捕获堆栈变量(不需要块副本) - 它可以按原样使用变量,从线程的堆栈中引用它们。

当程序员没有意识到何时需要显式复制块时,通常会出现问题。

于 2012-08-12T06:20:26.370 回答