【发布时间】: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