在块中更改实例变量

7

我对如何在代码块内更改实例变量感到困惑。

接口文件(.h):

@interface TPFavoritesViewController : UIViewController {
    bool refreshing;
}

实现方法:
__weak TPFavoritesViewController *temp_self = self;
refreshing = NO;
[myTableView addPullToRefreshWithActionHandler:^{
    refreshing = YES;
    [temp_self refresh];
}];

你可能猜到了,当我尝试在块内部更改刷新ivar时,会收到保留周期警告。如何在不出错的情况下完成这个操作?

1个回答

6

你被分配到 refreshing 是对 self 的隐式引用,它是以下操作的简写:

self->refreshing = YES;

因此出现了循环警告。将其改为:
temp_self->refreshing = YES;

2
仅有这段代码无法构建。我遇到了以下错误:由于竞争条件可能导致空值,不允许取消引用__weak。首先将其分配给一个强变量。我认为通过添加以下内容,我已经解决了这个问题:__strong TPRideListView * strong_self = temp_self; strong_self->refreshing = YES; - Keiran Paster
1
小心;解引用弱指针可能会导致崩溃。最好在块内从弱指针创建一个强指针,检查是否为空,并使用它。 - BJ Homer
@KeiranPaster - 抱歉我错过了第二个警告;如果你的代码能够避免警告,那就没问题了,只要你的对象一直存在(即self是有效的);该代码不处理可能出现的nil值。我假设你知道它是什么,如果你不知道... - CRD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接