如果您在ivar上有IBOutlet
IBOutlet UIView * view;
@property(非原子,保留)UIView * view;
由ib创建的对象将由ib管理,
但如果你有,
UIView * view;
@property(nonatomic,retain)IBOutlet UIView * view;
ib现在使用你的setter来设置那个对象吗?这意味着setter已经添加了+1并且需要设置为nil或者对象会泄漏吗?
答案 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加载器处理所有这些。