Using weak self in dispatch_async function

I read a lot of posts about using __weak self inside dispatch_async
, and now I am a litle bit confused. if I have :

self.myQueue = dispatch_queue_create("com.biview.core_data", NULL);
dispatch_async(self.myQueue, ^(void){ if (!self.var1) { 
        self.var1 = ...; 
} 
dispatch_async(dispatch_get_main_queue(), ^(void) { 
        if ([self.var2 superview])  { 
        [self.var2 removeFromSuperview]; 
} 
      [self.Label setText:text]; 
});

});

do I need to use __weak self. Because I read that in some cases dispatch_async not need a __weak self.

==========以上是问题========================

==========以下是答案========================

Assuming, self is an object pointer to a UIViewController.
Things to consider:

  • A UIViewController is a "UIKit" object. UIKit objects shall not be sent methods on non-main threads, that is - those methods must execute on the main thread only!

  • A block that has been enqueued in a queue - whether this was synchronously or asynchronously - will eventually be executed -- no matter what! Well, unless the program terminates before this can happen.(无论是同步还是异步,队列里面的block都将执行)

  • Captured retainable strong pointers will be retained when the block will be copied (for example, when dispatched asynchronously), and again released when the block will be destroyed (after it finished).

  • Captured retainable weak pointers will NOT be retained and not released.

In your scenario, where you capture self in the block which is dispatched on the main queue, you don't need to worry that bad things happen.

So, why? And what happens actually?
Since self will be captured in the block which is dispatched asynchronously, self will be implicitlyretained, and released again when the block has been finished.

That means, the life-time of self will be extended up until after the block finishes. Notice that yoursecond block is dispatched on the main thread, and it's guaranteed that self is still alive when that block gets executed.

This "extended life" above, might be a desired feature of your program.

If you explicitly don't want to extend the life-time of the UIViewController object,

and instead want the block - when it finally executes - check whether this UIViewController object does still exist at all, you can use a __weak pointer of self. Note that the block gets eventually executed, no matter whether the UIViewController
is still alive or has been deallocated in the mean time.

You might want the block doing "nothing" if the UIViewController
has been deallocated before the block will get executed:

MyController* __weak weakSelf = self;
dispatch_async(queue, ^{ 
MyController* strongSelf = weakSelf; 
if (strongSelf) { 
... 
} else { // self has been deallocated in the meantime. 
}
});

http://stackoverflow.com/questions/21987067/using-weak-self-in-dispatch-async-function

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者:林乐 文章转载自:新生大学 在知乎,类似 “如何才能月入十万” 这样的问题总是热度很高。先不评判题主的目标是...
    司徒乐阅读 418评论 2 0
  • 南涧山庄举办的三年一次武林高手比武大会现场,一个八九岁大的小姑娘一直观察着一位白衣翩翩手执折扇神情落寞的公子。...
    南畔雪枝阅读 190评论 0 4
  • 记得在要离开台湾的前两周,同学开始陆续办着离校手续和交半年交换的心得报告。在20号喝酒聚会之后大家就开始了告别的模...
    霹雳酷锤锤阅读 1,469评论 0 1
  • 站在记忆的埂上,轻抚青春发烧的额头,挥动手中的笔,记下那些已然定格的日子,轻轻地告诉这个世界:我曾来过。 ...
    都督去旅行阅读 326评论 0 0