有没有理由不这样做:
[[[CLGeocoder alloc] init] geocodeAddressStr...
而不是这种方式:
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressStr...
因为completionHandler 是一个块,并且不再使用geocoder 变量,所以最好不要创建它。还是我忽略了内存管理部门的事情?我正在使用ARC。
有没有理由不这样做:
[[[CLGeocoder alloc] init] geocodeAddressStr...
而不是这种方式:
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressStr...
因为completionHandler 是一个块,并且不再使用geocoder 变量,所以最好不要创建它。还是我忽略了内存管理部门的事情?我正在使用ARC。
我总是像你的第二个例子那样分解这些东西,主要是为了可读性。我的理解是,无论您是否分配它,编译器都会将它们视为完全一样,因为它必须创建对象才能使用它。我更愿意看到变量的名称可以清楚地表明意图是什么。
您可以使用上面显示的第一种方法。内存管理指南规定,如果您在内存 [...alloc] init] 中创建了一个对象,您应该负责释放它。但是,如果您使用的是 ARC,则无需发布任何内容。调用后:
[[[CLGeocoder alloc] init] geocodeAddressStr...
创建的对象将在必要时由系统释放。丢失新创建的对象应该没有问题,正如您在上面所说的那样,将不再使用该变量。
无需将语句分隔成两行。
您将需要创建CLGeocoder
-- 这是您正在调用的实例方法。但是,您可能不需要坚持下去。
ARC 和块能够捕获和保留 objc 变量——除了 C 和 C++ POD 以及 C++ 可复制构造类型。
具体来说,如果是异步的,则该块CLGeocoder
在geocodeAddressStr...
. 如果块是同步的,那么它可能不需要捕获堆栈变量(不需要块副本) - 它可以按原样使用变量,从线程的堆栈中引用它们。
当程序员没有意识到何时需要显式复制块时,通常会出现问题。