界面建设者安装者?请打我!

时间:2010-01-21 21:07:40

标签: iphone cocoa interface interface-builder

如果您在ivar上有IBOutlet

IBOutlet UIView * view;

@property(非原子,保留)UIView * view;

由ib创建的对象将由ib管理,

但如果你有,

UIView * view;

@property(nonatomic,retain)IBOutlet UIView * view;

ib现在使用你的setter来设置那个对象吗?这意味着setter已经添加了+1并且需要设置为nil或者对象会泄漏吗?

4 个答案:

答案 0 :(得分:4)

IBOutlet在生成的代码中没有做任何事情 - 它实际上是由预处理器擦除的。它就在那里,所以Interface Builder可以扫描你的标题,看看它应该作为出口处理的东西。

答案 1 :(得分:2)

阅读here,Aaron Hillegass发布了有关其中的一些内容。

  

在桌面上,当加载nib文件时,以合理的方式设置出口:设置名为foo的出口,nib加载器查找名为setFoo的访问者:。如果找不到访问器,则nib加载器直接设置变量foo。这听起来像键值编码,对吧?事实并非如此。重要的区别在于笔尖加载将foo视为弱引用;它指向的对象不会被保留。

     

因此,如果您创建一个NSViewController的子类,它有十几个出口到子视图,则只保留顶级视图。因此,当取消分配视图控制器时,它会释放顶级视图,并自动释放所有子视图。整齐!

     

然而,在手机上,笔尖加载器使用键值编码来设置插座;默认情况下,出口被视为强引用。如果您的插座没有访问器,则会保留它所引用的视图。

答案 2 :(得分:0)

这两种情况都必须释放插座。如果您有财产,IB将使用它并让您管理保留与否(如果您使用分配)。如果您没有属性,IB将分配值但会自动保留它,然后您需要将其释放。

如果将属性标记为IBOutlet,则无需将类变量标记为IBOutlet。

答案 3 :(得分:0)

AFAIK,如果您将IBOutlet放在ivar或财产上并不重要。无论哪种方式,一般来说,IBOutlet属性应该是(非原子的,赋值的),而不是保留,因为NIB加载器处理所有这些。