我已经习惯于使用弱引用和强引用以及何时使用它们以及何时不使用它们,我遇到了如下所述的情况(查看有关警告的评论)
@interface MPIViewController ()
@property (weak, nonatomic) UIView *subview;
@property (weak, nonatomic) UILabel *label;
@end
@implementation MPIViewController
// ...
// some code here
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
self.subview = [[UIView alloc] init]; // warning here: assigning retained object to weak property
self.label = [[UILabel alloc] init]; // no warnings
[self.view addSubView: self.subview];
[self.view addSubView: self.label];
}
// ...
// some code here
// ...
@end
从描述- (void)addSubview:(UIView *)view
:
该方法建立了对视图的强引用,并将其下一个响应者设置为接收者,即其新的超级视图。
这意味着该对象不会deallocated
在方法完成后出现,因为它superview
会保留它并持有对它的强引用,因此只要它的父视图存在,这个视图就会一直保存在内存中。我在这里吗?
我也不确定我是否理解在这里正确分配。警告说它会deallocated
在分配之后直接进行,但这听起来是错误的,因为这样就不可能将任何变量分配给弱指针,因为它会进入deallocated
下一行代码?
对于UILabel
相同的分配工作正常,但UIView
它没有?编译器是否以某种不同的方式对待 UIView?这真的让我感到困惑,这怎么可能。
只需将 UIView 分配给本地方法变量,然后将其传递给 setter,就可以轻松修复此代码,如下所示:
UIView *tmpView = [[UIView alloc] init];
self.subview = tmpView;
方法中声明的变量是默认的strong
,因此具有这样的构造会消除警告,因为编译器认为该变量具有强引用,因此只要方法变量指向它,那么随后分配给的弱引用将被保留。但!这有什么意义,因为 tmpView 只是一个局部方法变量,并且在方法完成后将被转储?