以下声明是否会引用强弱参考?我知道NSNotificationCenter块中的强引用会导致保留周期,所以我试图避免这种情况。
声明:
@interface MPOCertifiedAccountsViewController : MPORootViewController <UITableViewDataSource, UITableViewDelegate> {
UITableView *certifiedTableView;
}
呼叫:
- (id)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserverForName:MPOFriendManagerManagerDidFinishRefreshingLocal
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[certifiedTableView reloadData];
}];
}
return self;
}
答案 0 :(得分:4)
默认情况下,所有实例变量都是 strong 。但是,这与此无关,因为
[certifiedTableView reloadData];
实际上是
[self->certifiedTableView reloadData];
并且保留self
,而不是实例变量。所以你在这里有一个保留周期,
独立于certifiedTableView
是强实例还是弱实例变量。
您可以使用众所周知的技术来解决这个问题,即创建对self
的弱引用:
__weak typeof(self) weakSelf = self;
在块中使用:
typeof(self) strongSelf = weakSelf;
if (strongSelf != nil) {
[strongSelf->certifiedTableView reloadData];
}
您还应该考虑使用属性而不是实例变量。
使用self.certifiedTableView
,您会立即看到self
被保留。