2014-07-17 19 views
-1

有一堆关于所有这些薄弱和强大的自我的问题,但我想,你们在我的特殊例子接过来一看:弱和强烈的自我使用,块存储管理

- (void)getItemsWithCompletionHandler:(void (^)(NSArray*items))completionHandler { 
__weak __typeof__(self) weakSelf = self; 
[self doWorkWithCompletionHandler:^(Response *response) { 
    // this completion is not on main thread 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     ... 
     [weakSelf doAnotherWorkWithCompletionHandler:^(Response *response) { 
      // this completions is not on main thread either 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       __typeof__(self) strongSelf = weakSelf; 
       NSArray *itemsIds = [strongSelf doWorkOnMainThread1]; 
       NSArray *items = [strongSelf doWorkOnMainThread2]; 
       completionHandler(items); 
      }); 
     }]; 
    }); 
}]; 
} 

是一切正确的位置或不?也欢迎您提出重构建议

+3

这个问题可能会更好地排序在[Codereview](http://codereview.stackexchange.com/) –

+0

在外部局部范围内声明'itemsIds'和'items'有什么意义?这不是那个范围在异步操作中分配给这两个变量时会存在。 – newacct

+1

是什么让你觉得你需要弱引用? – newacct

回答

0

您应该检查completionHandler是否为NULL,然后调用它。

if (completionHandler) { 
    completionHandler(items); 
} 

否则你会崩溃,如果completionHandler为NULL


,如果你想打电话completionHandler(items)在所有如果self == nil在任何时候,你也可以考虑一下。我这么说,因为有一点不一致。
在行

[weakSelf doAnotherWorkWithCompletionHandler:^(Response *response) { 

如果weakSelf是已经为零,那么它的completionHandler不会被调用,并在结果completionHandler(items)也不会被调用。

但在这里:

__typeof__(self) strongSelf = weakSelf; 
NSArray *itemsIds = [strongSelf doWorkOnMainThread1]; 
NSArray *items = [strongSelf doWorkOnMainThread2]; 
completionHandler(items); 

如果self == nil然后completionHandler实际上将被调用。

当然,我没有看到整个图片,也许它是完全不相关的,但你可能想要考虑的事情。

进一步说,我想你宁愿completionHandler称为在每一个场景,即使self == nil在任何点。或者在出现任何问题时向其添加错误参数。


如果你想成为超级迂腐,你可能想要把__weak类型之后,因为这样的:

__typeof__(self) __weak weakSelf = self; 

这是首选的方法:https://developer.apple.com/library/ios/releasenotes/objectivec/rn-transitioningtoarc/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4(寻找“你应该装点变量正确的。“)

1

如果你把所有的警告,那么你会得到一个警告的

[weakSelf doAnotherWorkWithCompletionHandler... ]; 

您不应该将消息发送给弱对象。当被调用的方法正在运行时,弱对象可能会消失。将弱对象存储为强对象,结果不是零。如果你再调用

[strongSelf doAnotherWorkWithCompletionHandler... ]; 

你知道,无论是strongSelf ==零,没有任何反应,或者strongSelf是,虽然该方法执行不保持为零。