以编程方式创建视图Strong Vs控制器中的弱子视图

时间:2014-04-15 06:39:47

标签: ios objective-c weak-references

我正在使用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创建的那些?

1 个答案:

答案 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)。)