在头文件中,iVar声明的@interface在iOS中是强还是弱?

时间:2014-05-15 18:57:15

标签: ios objective-c

以下声明是否会引用强弱参考?我知道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;
}

1 个答案:

答案 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被保留。