我正在使用Xcode 5.1.1(适用于iOS 7.1)编写小型测试程序。我没有使用Xib或Storyboard。一切都以编程方式完成。在AppDelegate.m中,我创建TestViewController的实例并将其设置为窗口的rootViewController。在TestViewController.m中,我覆盖了“loadView”以创建并分配控制器的主视图。
TestViewController.h
--------------------
@interface TestViewController : UIViewController
@property (nonatomic, weak) UILabel *cityLabel ;
@end
TestViewController.m
--------------------
@implementation TestViewController
- (void)loadView
{
UIView *mainView = [[UIView alloc] init] ;
self.view = mainView ;
}
- (void) viewDidLoad
{
UIView *addressView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)] ;
[self.view addSubview:addressView] ;
[self createCityLabel:addressView] ;
}
- (void) createCityLabel:(UIView *)addressView
{
// Warning for below line - Assigning retained object to weak property...
self.cityLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 80, 30)] ;
[addressView addSubview:self.cityLabel] ;
}
@end
据我了解,所有权如下
testViewController ---(strong)-> self.view-(strong)-> addressView对象-(strong)-> self.cityLabel对象
因此,self.cityLabel可以弱引用其目标Object
self.cityLabel-(弱)-> self.cityLabel的对象。
我的确在这里遇到了其他类似问题。建议在所有位置将ViewController内的IBOutlet属性保持为“弱”(尽管不是强制性的,除非存在循环引用)。唯一重要的参考是控制器的主视图。
但是,我在所示的createCityLabel函数内部收到警告。如果我删除了“弱”属性,这将消失。这真是令人困惑。将插座保持为弱的建议仅适用于使用Xib / Storyboard创建的插座吗?
最佳答案
您的cityLabel
属性可能很弱,但是必须先将其添加到视图层次结构中,然后才能分配该属性或将其分配给标准(强引用)变量。
发生的情况是,您正在创建UILabel
,然后将其分配给不假定其所有权(弱)的属性。经过self.cityLabel = [[UILabel alloc] ...
行之后,UILabel
已经被释放,并且cityLabel
属性为nil。
这将正确执行您的打算:
UILabel *theLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 80.0f, 30.0f)];
self.cityLabel = theLabel;
[addressView addSubview:theLabel];
在
theLabel
范围内,变量UILabel
将保留createCityLabel:
,并将UILabel
作为子视图添加到视图控制器视图的一部分将在视图控制器的整个生命周期内保留它(除非您从视图或视图中删除UILabel
或任何UILabel
的父视图))。