我正在使用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 ---(强) - > self.view - (强) - > addressView的对象 - (强) - > self.cityLabel的对象。
因此,self.cityLabel可以是对其目标Object的弱引用
self.cityLabel - (弱) - > self.cityLabel的对象。
我在这里就类似问题做了一些其他问题。建议将ViewOtroller中的IBOutlet属性保持为“弱”(尽管不是强制性的,除非有循环引用)。只有强大的参考值才能保持控制器的主视图。
但是,我在createCityLabel函数中收到警告,如图所示。如果我删除“弱”属性,这就消失了。这真令人困惑。是否建议将Outlets保持为弱适用于仅使用Xib / Storyboard创建的那些?
答案 0 :(得分:8)
您的cityLabel
属性可能很弱,但您必须先将其添加到视图层次结构中,然后才能分配属性或将其分配给标准(强引用)变量。
发生的事情是您正在创建UILabel
,然后将其分配给不承认其所有权的属性(弱)。在您越过self.cityLabel = [[UILabel alloc] ...
行后,UILabel
已被取消分配,且cityLabel
属性为零。
这将正确地执行您的意图:
UILabel *theLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 80.0f, 30.0f)];
self.cityLabel = theLabel;
[addressView addSubview:theLabel];
变量theLabel
将在UILabel
范围内保留createCityLabel:
,并将UILabel
作为子视图添加到属于View Controller&#39的视图中; s视图将在视图控制器的生命周期内保留它(除非您从视图或任何UILabel
的父视图中删除UILabel
)。)