【问题标题】:AFNetworking, UITableView and BlocksAFNetworking、UITableView 和 Blocks
【发布时间】:2013-10-17 07:42:03
【问题描述】:

所以我正在阅读 How do I avoid capturing self in blocks when implementing an API? 关于内存管理如何在完成块中引用 self 的内容,这让我开始思考:以下是否会导致保留周期?

伪代码:

[AFnetworking requestGet:@"http://www.website.com" completionBlock:(^)(RequestObj* request, NSError* error){
      [self.tableView reloadData];
}];

忽略语法问题,self.tableView 是否会导致循环保留?是否有必要改为执行以下操作?

__weak id weakSelf = self;
[AFnetworking requestGet:@"http://www.website.com" completionBlock:(^)(RequestObj* request, NSError* error){
      [weakSelf.tableView reloadData];
}];

或者 AFNetworking 是否有某种记忆魔法来防止这种情况发生?


由 Aaron Brager 提供编辑

这里没有保留周期。但是如果你这样做了,在完成块中,你应该将 weakSelf 转换回强引用,这样它就不会在完成块的中途被释放。

id strongSelf = weakSelf; 
[strongSelf.tableView reloadData];

【问题讨论】:

  • 这里没有保留周期。但是如果你这样做了,在完成块中,你应该将weakSelf 转换回一个强引用,这样它就不会在你的完成块中途被释放。 (id strongSelf = weakSelf; [strongSelf.tableView reloadData];)。

标签: ios objective-c uitableview afnetworking objective-c-blocks


【解决方案1】:

当两个或更多对象相互具有强引用时,就会发生保留循环。

在这种情况下,该块将具有对 self 的强引用,但 self 没有对该块的强引用,所以 你在这里很好无需使用 weakSelf

当你有一个保留循环并且需要使用weakSelf 来打破它的情况是当类也对块有强引用时,如下例所示:

typedef void (^CompletionCallback)(RequestObj* request, NSError* error);

@interface SomeClass() {
    /// Strong reference to the block
    CompletionCallback completionBlock;
}
@end

@implementation SomeClass()

- (void)someMethod {
    completionBlock = ^(RequestObj* request, NSError* error) {
        /// Strong reference to the class
        [self.tableView reloadData];
    };

    [AFnetworking requestGet:@"http://www.website.com" completionBlock:completionBlock];
}

@end

在此示例中,completionBlockself 都具有相互强引用,因此您将在此处有一个保留循环并需要中断它。

【讨论】:

  • 是像你这样的人,Hejazi,让我爱上了 stackoverflow。谢谢你真棒。
  • 很高兴能提供帮助。我更新了答案以举例说明您将拥有一个保留周期。
  • 请记住,强引用循环可能不是那么简单。例如,如果你的控制器有一个对象的强引用,那个对象有一个完成块的强引用,然后完成块强引用你的控制器,你仍然会有一个保留周期,只有 3 个对象而不是2.
  • 是的,这就是为什么我说“当两个或 更多对象 相互强引用时”,但在我们的例子中,控制器没有强引用例如AFnetworking 的实例。
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多