iVar声明是否位于头文件';iOS中的s@interface括号是强还是弱?

iVar声明是否位于头文件';iOS中的s@interface括号是强还是弱?,ios,objective-c,Ios,Objective C,下面的声明和调用是强引用还是弱引用?我知道NSNotificationCenter块中的强引用可能会导致保留周期,所以我试图避免这种情况 声明: @interface MPOCertifiedAccountsViewController : MPORootViewController <UITableViewDataSource, UITableViewDelegate> { UITableView *certifiedTableView; } 默认情况下,所有实例变量都

下面的声明和调用是强引用还是弱引用?我知道NSNotificationCenter块中的强引用可能会导致保留周期,所以我试图避免这种情况

声明:

@interface MPOCertifiedAccountsViewController : MPORootViewController <UITableViewDataSource, UITableViewDelegate> {

    UITableView *certifiedTableView;
}

默认情况下,所有实例变量都是强的。然而,这与此无关,因为

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

默认情况下,所有实例变量都是强的。然而,这与此无关,因为

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

因此,我可以通过使用code
\u block typeof(self)blockSelf=self来解决这个问题;[blockself->certifiedTableView重载数据]
@MikeV:假设您使用ARC编译,您必须创建一个弱引用,而不是一个_块。好的,太好了。我有点搞不清楚_block和_弱之间的区别是什么,但我会更深入地研究这个问题。Thanks@MartinR--我一直在想,在这种情况下,是增加self的保留计数还是增加iVar的保留计数。你确定吗?(很明显,self.property调用self上的getter,但在我看来,_iVar是一个不带self的裸指针,如果编译器需要,它可以保留w/o self)@MikeV:在古代的“手动引用计数”时代,__块被用来创建一个不保留在块中的变量。这种行为随着ARC的改变而改变,您现在必须使用_。这应该记录在“到ARC发布说明的转换”中。因此,我可以通过使用代码
\uuu block typeof(self)blockSelf=self来解决这一问题;[blockself->certifiedTableView重载数据]
@MikeV:假设您使用ARC编译,您必须创建一个弱引用,而不是一个_块。好的,太好了。我有点搞不清楚_block和_弱之间的区别是什么,但我会更深入地研究这个问题。Thanks@MartinR--我一直在想,在这种情况下,是增加self的保留计数还是增加iVar的保留计数。你确定吗?(很明显,self.property调用self上的getter,但在我看来,_iVar是一个不带self的裸指针,如果编译器需要,它可以保留w/o self)@MikeV:在古代的“手动引用计数”时代,__块被用来创建一个不保留在块中的变量。这种行为随着ARC的改变而改变,您现在必须使用_。这应记录在“到ARC的过渡发布说明”中。