IBOutlets强引用或弱引用

7

可以像这样创建输出口

@interface SearchViewController : UIViewController<UISearchBarDelegate> {    
    IBOutlet UIView *viewSearchBar;
    IBOutlet UIScrollView *scrollVieww;
    IBOutlet UILabel *lblName;
}

同时也可以这样做

@interface SearchViewController : UIViewController<UISearchBarDelegate> {

}

@property(nonatomic, weak) IBOutlet UIScrollView *scrollVieww;
@property(nonatomic, weak) IBOutlet UIView *viewSearchBar;
@property(nonatomic, weak) IBOutlet UILabel *lblName;

@end

我知道在 ARC 中的 nonatomic/atomicstrong/weak,但在第一个例子中它们是什么?是 strongweaknonatomic 还是 atomic

请解释或链接一些详细信息。


1
无论在ARC中给视图拥有的插座声明为strong还是weak,都没有关系,因为视图将对该元素保持强引用。 - Joe
@Joe 是的,我同意,但仍然想知道它们是什么。 - Raheel Sadiq
@lxt 我之前看过这个问题,但是对我来说并没有澄清。 - Raheel Sadiq
2
请注意,viewDidUnload在iOS6中已被弃用并不再被调用。因此,如果您的部署目标是>=6.0,您可以放心地摆脱所有的viewDidUnload代码 :) - Mike Pollard
1
@RaheelSadiq 苹果建议IBOutlet引用应该是弱引用(因此您的第二个示例),除了顶层对象。虽然该文档专注于NIB,但对于storyboard也是如此。 - Rob
1
@Rob 是的,我做过,我主要维护一个手动释放/保留的项目,所以在ARC的某些部分上有点生疏,但我还是记得的,谢谢。 - Joe
3个回答

7

ARC模式下的实例变量默认是强引用,它们既不是原子性的,也不是非原子性的,因为它们只是实例变量而不是访问方法。原子/非原子标志与多线程有关,它们指定访问方法是否应该是原子性的。当访问器是原子的时候,执行不能在访问器方法的中途切换到另一个线程。当它是非原子的时候,没有这样的限制。

注意:IBOutlet仅仅是一个Interface Builder的标识符,没有任何与内存相关的功能。


2
顺便说一句,我知道你已经知道了,但是为了未来的读者着想,希望读者不要将你的评论解释为认为将其设置为“原子性”可以确保线程安全。它并不能。请参阅《Objective-C编程指南》中的属性默认为原子性 - Rob
对于那些想知道 IBOutlet 的确切定义是什么的人(来自文档):用于标识属性的标识符,以便 Interface Builder 可以将输出口的显示和连接与 Xcode 同步。在任何声明中,在类型之前立即插入此标识符。 - Kasper Munck

5

在ARC下,默认情况下变量是__strong的,因此:

IBOutlet UIView *viewSearchBar;

IBOutlet __strong UIView *viewSearchBar;

是相同的。

关于在ARC下处理IBOutlets的推荐方式,请参见:这个答案


那么我们应该采用第二种方法吗? - Raheel Sadiq
就像他所说的那样,它们是相同的。无关紧要。我建议只是省略它,并且只在真正重要或意外时明确指定某些强项。 - DrummerB
3
通常建议IBOutlets是弱引用。请参考我在答案中添加的链接问题。 - Mike Pollard

3

感谢您链接我的答案 ;) - Lorenzo B
1
除了顶层对象(通常不会为其拥有自己的IBOutlet),任何东西都应该是弱引用。请参阅资源编程指南中的“管理对象的生命周期”(https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW6)。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接