阻止并保留int变量的循环?

时间:2013-11-28 09:48:33

标签: ios objective-c block cycle

在下面的代码中,我创建了一个对self的弱引用,以避免保留循环.Ok 问题是xCode给了我同样的警告“在这个块中强烈捕获自我可能导致”currentPage“变量的保留周期”,这是一个int变量。为什么“currentPage”会导致保留周期,而它是非Objective-c对象指针类型

__weak CoresspondenceDetailsViewController *weakself = self;
[tableViewBackground.tableView addInfiniteScrollingWithActionHandler:^
 {
    [weakself getPrivateCorrespondencesForPage:currentPage];
 }

显示奇怪警告的图片。

enter image description here

谢谢

3 个答案:

答案 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