[英]Why some Outlets are made strong references even tough the documentation specifies that outlets should be weak reference
嗨,我是iOS编程的新手。 我知道强弱的参考是什么 。 但是当我不得不处理插座时,我会混淆使用哪种类型的参考。 经过文件说明
Outlets通常应该是弱的,除了那些从File的Owner到nib文件中的顶级对象(或者,在iOS中,故事板场景)应该很强。
所以我在完成上述陈述后理解的是,我们创建的奥特莱斯默认情况下通常应该很弱 。
但是在学习一些教程时,我遇到了一些代码,人们已经宣布了一个强大的参考 。 例如,请考虑以下代码:
@interface AboutViewController : UIViewController
@property (nonatomic, strong) IBOutlet UIWebView *webView;
@end
代码 :
@property (nonatomic, strong) IBOutlet UIWebView *webView;
说我们的AboutViewController有一个UIWebView对象 。
但是为什么我们需要一个强大的UIView对象参考 ? 正如文件所述,这不应该是一个弱的参考?
另外,请在上面引用的文档声明中解释文件所有者对顶级对象的含义是什么?
我在这个网站上经历了很多类似的问题,但没有一个能帮我清除疑虑。 所以请帮忙。 提前致谢 :)
非顶级GUI元素的用途 - 强或弱 - 取决于您如何使用他们的网点。 如果你有一个弱参考
@property (nonatomic, weak) IBOutlet UIWebView *webView;
然后调用方法
[webView removeFromSupeview];
你的webView将是零,只是通过添加来恢复UIWebView是不可能的
[self.view addSubview:webView];
如果这适合您 - 最好使用weak,因为当您不需要时,您将释放webView的内存。
另一方面,如果有strong
参考后
[webView removeFromSupeview];
webView仍将具有referenceCount> 0,并且仅当所有者将显式释放它时才会取消分配webView
self.webView = nil;
或者在主人的
- (void)dealloc
与业主本人一起。
通常,如果您有静态GUI,则没有区别。 如果要删除(不隐藏)某些视图,可以在以后添加它们 - 应该使用强引用。
顶级对象应保持强大。 喜欢
@property(nonatomic,retain) UIView *view;
在UIViewController中。
在这样的出口的情况下,使用强引用代替弱引用通常没有坏处。 在某些情况下,您需要一个强大的参考。
这个想法是,某些东西必须始终保持对物体的强烈参考,否则它可能会消失。 如果对象是另一个视图的子视图的视图,那么该超级视图将保留对它的强引用,因此您可以使用弱引用。 但是,如果您要对该视图执行其他操作,例如出于某种原因将其从超级视图中删除(可能在其他地方重复使用,或者某些事情),那么您将需要使用强大的属性,以便始终持有它的东西。
关于文件所有者问题,那是因为顶级对象(很可能是一个视图)没有超级视图保留它,所以你需要使用一个强大的属性,这样你才能坚持下去。
简单的答案是,除非你支持iOS 5,否则网点应该总是很强大。
弱插座的目的是在iOS5中,如果系统卸载视图控制器的视图以节省内存,则任何指向子视图的插座都将自动释放。
在iOS 6及更高版本中,系统永远不会卸载视图控制器的视图(从不调用viewDidUnload),因为Apple找到了一种方法来释放视图使用的大部分内存而不释放视图本身。
因此,在视图控制器本身被释放之前,视图控制器中的插座通常不需要被释放,此时ARC将清理所有插座。
因此,只需对所有商店使用strong,您就不必担心由于使用错误的引用类型而导致的模糊错误或编译器警告。
引用Apple的资源编程指南 ,
每次请求NSBundle或NSNib类加载nib文件时,底层代码都会在该文件中创建对象的新副本并将它们返回给您。 您需要确保在必要时维护新的对象图,并在完成后将其取消。 您通常需要对顶级对象的强引用,以确保它们不会被释放; 您不需要对图表中较低的对象进行强引用,因为它们由父母拥有,您应该尽量减少创建强引用周期的风险。
对于像UIViewController
这样的框架类,NIB文件的顶级对象是view
属性。 如果您签入文档,则将其声明为retain
(类似于strong
)。
@property(nonatomic, retain) UIView *view
因此,此容器view
任何子视图都应由它自动拥有。 如果您现在将这些子视图出口声明为strong
那么当框架尝试清理容器view
时,它们将创建一个strong
循环并导致内存泄漏。 为避免这些强循环,应将所有子视图(或非顶级对象)声明为weak
属性。
什么时候能宣布IBOutlet
strong
当插座应被视为拥有引用对象时,应将插座更改为强:
- 如前所述,通常情况下,文件的所有者 - nib文件中的顶级对象通常被视为归文件所有者所有。
- 在某些情况下,您可能需要来自nib文件的对象存在于其原始容器之外。 例如,您可能有一个可以暂时从其初始视图层次结构中删除的视图的插座,因此必须单独维护。
如果webView
对象符合上述case2的条件,则需要检入代码。 如果不是教程已经错了,它实际上应该是weak
。
希望有所帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.