在下面的代码中,我创建了一个对self的弱引用,以避免保留循环.Ok 问题是xCode给了我同样的警告“在这个块中强烈捕获自我可能导致”currentPage“变量的保留周期”,这是一个int变量。为什么“currentPage”会导致保留周期,而它是非Objective-c对象指针类型
__weak CoresspondenceDetailsViewController *weakself = self;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
{
[weakself getPrivateCorrespondencesForPage:currentPage];
}
显示奇怪警告的图片。
谢谢
答案 0 :(得分:3)
答案很简单! 如果您的变量currentPage是视图控制器的ivar,那么访问此变量的实际结果将类似于
self->currentPage
这显然导致了自我保留。
两种可能的解决方案:
__weak CoresspondenceDetailsViewController *weakSelf = self;
int page = currentPage;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
{
CoresspondenceDetailsViewController *strongSelf = weakSelf;
if (strongSelf) {
[strongSelf getPrivateCorrespondencesForPage:page];
}
}
或
__weak CoresspondenceDetailsViewController *weakSelf = self;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
{
CoresspondenceDetailsViewController *strongSelf = weakSelf;
if (strongSelf) {
[strongSelf getPrivateCorrespondencesForPage:strongSelf->currentPage];
}
}
更新
我根据下面的可爱评论更新了代码。事实上,苹果公司建议采用自我封锁方式。
答案 1 :(得分:1)
currentPage
似乎是一个ivar,因此你得到了警告 - 因为访问一个ivar需要一个隐含的自我。
将有两种解决方案,它们并不完全相同:
__weak CoresspondenceDetailsViewController *weakself = self;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
{
CoresspondenceDetailsViewController* strongSelf = weakSelf;
[strongSelf getPrivateCorrespondencesForPage:strongSelf.currentPage];
}
或
NSInteger cp = self.currentPage;
__weak CoresspondenceDetailsViewController *weakself = self;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
{
CoresspondenceDetailsViewController* strongSelf = weakSelf;
[strongSelf getPrivateCorrespondencesForPage:cp];
}
答案 2 :(得分:0)
尝试以下方法:
__unsafe_unretained typeof(self) weakSelf = self