消息__weak对象?

如果我发送消息给弱对象会发生什么? 发送消息是否拥有该对象并将其保存在内存中直到返回?

我正在考虑这种模式:

__weak MyObject *weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf doSomeAction]; }); 

假设发送消息时weakSelf不为零,可能在doSomeAction正在工作时解除分配,还是保证在doSomeAction返回之前保持有效?

从Clang ARC文档 :

在对象左值执行左值到右值转换时发生操作。

  • 对于__weak对象,当前指针被保留,然后在当前完整expression式的末尾被释放。 这必须primefaces地执行任务和指出对象的最终释放。

传递一个弱引用对variables执行左值到右值的转换,这意味着弱引用的值将被保留,然后在当前的完整expression式(基本上是语句)结束时释放。 这基本上等同于分配一个强大的variables,其范围只能持续当前的语句,然后传递这个强大的variables。

这里的要点是,如果你想一次给一个弱variables发送消息,而不再一次触及它,那么在弱引用结束nil的情况下,你不关心评估该方法的参数的副作用,继续直接发送弱参考。 但是如果您需要两次(在单独的语句中)引用弱引用,或者评估参数的副作用确实很重要,那么您应该先指定一个强variables并在继续之前对非零进行testing。

你问:

假设发送消息时weakSelfnil ,在doSomeAction正在工作时是否可以解除分配,还是保证在doSomeAction返回之前保持有效?

是的,它不仅在doSomeAction返回之前保持有效,而且还保留在块的其余部分。 考虑以下:

 - (void)dealloc { NSLog(@"%s", __FUNCTION__); } - (void)startBackgroundOperation { __weak MyObject * weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [weakSelf doSomeAction]; sleep(5); [weakSelf doSomeAction2]; }); sleep(1); } - (void)doSomeAction { NSLog(@"%s", __FUNCTION__); } - (void)doSomeAction2 { NSLog(@"%s", __FUNCTION__); } 

在这个例子中,我确定当这个块开始的时候,这个对象在范围内,但是让它落在doSomeActiondoSomeAction2之间的范围doSomeAction2 ,但是这个块看起来是为了块的完成而保留的。 但是,如果我将doSomeAction的引用doSomeAction2 ,那么就像你所期望的doSomeActionweak引用就nil时间到了doSomeAction2


另外,在WWDC 2011 – #322 – Objective-C深度进展中 ,他们指出(大约27:00分钟的video),他们指出,如果你的weakSelf ,你应该有一个本地强在调度模块内部引用以保护您的竞争状态,从而:

 __weak MyClass *weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ MyClass *strongSelf = weakSelf; if (strongSelf) [strongSelf->myView doSomeViewAction]; }); 

这将在块的持续时间内保留它(假设它在块被执行的时候还没有被释放)。