3

假设我有一个父 UIView。这个 UIView 有一个指向子视图 UIImageView 的弱指针。如果 UIView 当前显示在屏幕上,由于父 UIview 只有对 UIImageView 的弱引用,图像视图是否可能被垃圾收集?

仅供参考 UIview 和 UIImageView 都将在屏幕上

4

4 回答 4

4

这个 UIView 有一个指向子视图 UIImageView 的弱指针

停止。如果 UIImageView 是 UIView 的子视图,那么 UIView 有一个指向 UIImageView 的指针。故事结局。

换句话说,视图保留了它的子视图。只要子视图是子视图,它就不会烟消云散。

现在,另一方面,如果您删除了该子视图,那么您必须担心它的内存管理,否则它可能会化为乌有。

于 2013-03-12T00:22:13.170 回答
1

当您向视图添加子视图时,根据定义,它将保持对该子视图的强引用。这只是addSubview维护视图层次结构的内部过程的一部分。视图将保持对其子视图的强引用,直到该子视图被手动删除(例如, via removeFromSuperview)或者如果父视图本身被删除(例如,您关闭了它的视图控制器)。

视图内部在其子视图上维护的这些强引用不应与weak您(或 IB)可能添加到您的视图或视图控制器子类 .h 文件的引用相混淆。这些weak引用只是为您提供引用子视图或控件的便捷方式。您的 .h 文件具有weak对子视图的引用(例如IBOutlet为了您的利益)这一事实并不会改变视图自动在幕后对其子视图的强引用作为整体视图层次结构的一部分这一事实。

因此,一个子视图,例如一个图像视图,只有在其最后一个强引用被删除时才会被释放(或者在非 ARC 语言中,当保留计数降至零时)。如果您已将图像视图添加为子视图,则在消除该强引用之前它不会被释放(即图像视图从其父视图中删除,或者父视图本身被删除)。显然,如果您要维护对控件的其他强引用,那么也必须删除这些引用,以便释放子视图。

一个警告:如果你没有使用 ARC,也就是说,你正在做手动引用计数(例如手动调用releaseand autorelease),你肯定有可能犯编程错误并“过度释放”图像视图,从而让保留count 降为零,因此可以过早地释放它。但是鉴于您在weak问题中引用了属性,您必须使用 ARC,所以这个观察是没有实际意义的。

在其他情况下,草率地使用weak变量可能会导致问题,但我不愿详细说明,除非您告诉我们子视图根本没有显示。

(顺便说一句,您在问题中提到了垃圾收集(GC),但我认为真正的问题是“我的子视图是否可能在 ... 时被释放”。显然,iOS 没有 GC。但我假设真正的问题是您的子视图是否可能在其仍存在于其父视图上时被释放。)

于 2013-03-12T05:57:24.737 回答
1

当期望创建子视图并将其直接添加到视图子视图层次结构时,您可以在子视图上使用“弱”属性:UIView addSubview:已经保持对视图的强引用。

如果您的视图是 UIViewController 的弱属性,您通常从 NIB 或在-(void)viewDidLoad. 如果控制器的视图因为不再需要而被丢弃,那么您的子视图也会如此。

于 2013-03-12T00:17:23.797 回答
0

如果 UIVIew 添加了 UIImageView ,则引用将增加,直到从视图中删除该操作才会释放。

在不知道你为什么问这个的情况下,我还会说我认为对它进行字符串引用不会有任何害处,因为在清理 UIView 时,它也会取消引用 uiimageview 并且它会被释放然后。

另外我知道你说垃圾收集但iOS没有垃圾收集。不过我知道你的意思

于 2013-03-12T00:14:39.633 回答