objective-c - 有目的地创建保留循环(没有 GC 的 Objective-C )

标签 objective-c memory-management automatic-ref-counting retain-cycle

有没有这样的情况,即故意创建一个保留循环以防止重新分配,然后在以后清理它,是解决问题的最佳方法?

如果是这样,Cocoa Touch 或 NextStep 框架中是否有这方面的示例?

我打算将此问题特定于带有 ARC 的 Objective C,因为带有 GC 的 Objective C 或带有 GC 的其他语言可能表现不同。

最佳答案

当然。这实际上并不少见,尽管您可能没有意识到。

例如,假设我的 Controller 正在发出网络请求,我真的需要确保我处理响应,即使用户已经离开该 Controller 也是如此。

我可能会这样做:

- (void)doNetworkThing {
    __block MyController *blockSelf = self;

    NSURLRequest *request = // some request
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
      ^(NSURLResponse *response, NSData *data, NSError *error) {
          // Handle the response here
          [blockSelf doThingWithResponse:response];
      }];
}

这引入了一个简单的保留循环,其中 self 通过将自己分配给强指针 blockSelf 使自己被保留。直到 blockSelf 超出范围,self 才会被释放。

请注意,在这种情况下,您通常会使用弱指针。但是如果你真的需要 Controller 来处理它,使用强指针也可以。一旦处理程序 block 被释放,它对 blockSelf 的引用就会消失。由于对 blockSelf 的堆栈引用也消失了,如果没有其他人持有它,那么 self 将被释放。

基本上,blockSelf 导致了一个临时的保留周期,这有助于确保在请求完成之前不会发生释放。因为当 __block 变量超出范围时 ARC 会自动清除保留计数,所以它看起来不太像保留循环。但无论如何,事实就是如此。

关于objective-c - 有目的地创建保留循环(没有 GC 的 Objective-C ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16343509/

相关文章:

ios - UISearchController 就像 Instagram Explore Tab

c++ - 释放指针 vector ,但内存仍在使用中

iphone - 使用 ARC 重新初始化/重新分配对象

c++ - 删除继承自QWidget的对象,WA_DeleteOnClose段错误

objective-c - ARC 是否支持调度队列?

ios - "Assigning retained object to weak property"与初始化?

swift - 为什么 Swift 闭包不捕获 self ?

iphone - 如何编写测试用例?

animationControllerForPresentedController 和 animateTransition 之间的 iOS 未知延迟

iphone - 了解崩溃日志 - KERN_PROTECTION_FAILURE