【发布时间】:2015-04-01 19:40:41
【问题描述】:
我正在创建一个需要有一个进度窗口的应用程序,我想在其中为每个正在处理的项目动态插入一个子视图,例如 Finder 的复制文件面板窗口。并在处理完成时动态删除它。
我想对所有子视图使用相同的 NSViewController 视图,并且我正在使用 NSStackView 来管理视图。
但是,为了使子视图留在内存中,我必须保持对它们的强引用,而我知道的唯一方法是为我需要显示的每个子视图创建一个属性。像这样:
@propery (strong) NSViewController *myViewController1;
@propery (strong) NSViewController *myViewController2;
@propery (strong) NSViewController *myViewController3;
@propery (strong) NSViewController *myViewController4;
....
我想知道是否有更好、更动态的方式来做到这一点?或者我是否必须为子视图创建 x 个属性才能知道我有足够的实例来分配,因为我无法确定用户在运行应用程序和导出项目时需要多少进程视图。
因此,我想动态分配每个子视图并创建对它的强引用。那可能吗?还是有其他方法可以做我想做的事?
如果我不清楚,请告诉我,我很乐意解释更多以获得有关此问题的帮助。
【问题讨论】:
-
将它们存储在一个数组中怎么样?
-
是的,这可以做到,但我该如何做到这一点,并且仍然保持强引用,这样视图就不会被释放。我可以在我的测试代码中动态添加和删除任意数量的内容,但是当尝试与视图交互时,我会因为它已被释放而崩溃。还是我不理解您的建议是否正确?
-
数组(即
NSArrays)保持对其元素的强引用。您保留对数组的单个强引用,并将视图控制器添加到数组(保留对它们的强引用)。当你从数组中移除一个视图控制器时,数组会释放它的引用。当数组被释放时(在你释放对它的强引用之后,当你的对象被释放时,如果不是之前的话),它也会释放对它所有元素的引用。 -
谢谢,效果很好。我希望我可以将您的评论标记为正确答案。如此简单的解决方案,我完全错过了。
标签: objective-c cocoa nsviewcontroller nsstackview