gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:42:17 25 4
gpt4 key购买 nike

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

如果是这样,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com