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