如何通过asynchronous或静态调用实现强大的保留循环?

我正在努力去掌握如何才能认识到一个强大的保留周期是可能的,并要求我使用[weak/unowned self] 。 我被不必要地使用[weak/unowned self]烧毁了,在给我机会使用它之前,我自己就被释放了。

例如,下面是在闭包中引用self的asynchronousnetworking调用。 可以在这里发生内存泄漏,因为networking调用是在不将自身调用存储到variables的情况下进行的?

 NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) { (data, response, error) in self.data = data ) 

下面是使用NSNotificationCenter的另一个例子,可以稍后进行asynchronous调用:

  NSNotificationCenter.defaultCenter().addObserverForName( UIApplicationSignificantTimeChangeNotification, object: nil, queue: nil) { [unowned self] _ in self.refresh() } 

我的问题是在什么情况下可能有强大的保留周期? 如果我在一个闭包中进行一个asynchronous调用或静态调用来引用self,是否会使它成为[weak/unowned self]的候选人呢? 感谢您排除这一点。

保留周期是指两个对象之间具有强关联的情况。

在这里输入图像说明

你正在使用静态variablesNSURLSession.sharedSession()和NSNotificationCenter.defaultCenter(),你可能记得:

单例对象提供了对其类的资源的全局访问权限…您可以通过工厂方法从单例类中获取全局实例。 class级在第一次请求时懒洋洋地创build它的唯一实例,并确保不能创build其他实例。 单例类还可以防止调用者复制,保留或释放实例。

https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html

你的“自我”实例(像其他人一样)并没有强烈的引用单例对象及其closures,这就是为什么你不必担心你的情况下的保留周期。

查看这个伟大的文章了解更多详情: https : //digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/

简而言之:

保留周期可能发生在两种情况下。

情况1:

当两个实例相互强有力的引用。 你必须通过标记其中一个弱点来解决这个问题。

案例2 :(与您的问题有关)

如果将一个闭包分配给一个类实例的属性,并且该闭包的主体捕获该实例。

在你的两个例子中,根本不需要使用弱自我, NSNotificationCenter也不需要NSURLSession是你的类实例的属性。 (或者换句话说,你没有强烈的引用)

检查这个例子,我必须使用弱自我:

 [self.mm_drawerController setDrawerVisualStateBlock:^(MMDrawerController *drawerController, MMDrawerSide drawerSide, CGFloat percentVisible) { if (drawerSide == MMDrawerSideRight && percentVisible == 1.0) { [weakself showOverlayBgWithCloseButton:YES]; } else{ [weakself hideOverlayBg]; } }]; 

我有一个强大的参考mm_drawerController ,我分配一个封闭的权利? 在这个封闭的内部,我想捕捉自我。 所以closures会有很强的参考自我! 这是一场灾难。 在这种情况下,你将有一个保留周期。 要打破这个循环,在闭包中使用弱自我。