如何通过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其他实例。 单例类还可以防止调用者复制,保留或释放实例。
你的“自我”实例(像其他人一样)并没有强烈的引用单例对象及其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会有很强的参考自我! 这是一场灾难。 在这种情况下,你将有一个保留周期。 要打破这个循环,在闭包中使用弱自我。