【问题标题】:How do I keep an object created within a method alive in objective-c?如何使在objective-c中的方法中创建的对象保持活动状态?
【发布时间】:2013-04-24 21:38:44
【问题描述】:

我想在我使用核心图创建的应用程序中放置多个饼图。我创建了一个包装类(我们称之为PieChartViewController),它是一个视图控制器,并设置了图形以及一些按钮和动作以使图形具有交互性。为了部署它,我通常只在另一个持有PieChartViewController 的视图控制器上创建一个属性,当我初始化这个视图控制器时,我只需分配/初始化PieChartViewController 并将其视图添加到主视图。这通常工作正常。

问题是,在另一个视图上,我想向视图添加可变数量的图形,而这个数量是在初始化视图控制器时确定的。我有一个初始化每个PieChartViewController 并将其添加到父级上的NSMutableDictionary 的方法,以便我可以保留对它们的引用。但是,这似乎并没有让它们保持活力,因为我总是遇到 BAD_ACCESS 2 崩溃,并且在运行仪器时我意识到它们被释放了。

因此,当PieChartViewControllers 存储在一个属性上时,一切都很好,但是当我将它们放入字典时,它们似乎没有保持足够长的时间。我仍然不太熟悉objective-c中的内存管理,我不确定如何去做,希望能提供任何帮助。

【问题讨论】:

  • 也许你应该展示一些代码 - 初始化 PieChartViewControllers 并将它们添加到字典中的方法。字典被释放了吗?你是怎么坚持下来的?
  • 自从 ARC 实施以来,iOS obj-c 中的内存管理不再是一件可怕的事情。但是,正如他所说:您应该发布一些代码或提供更多细节(但不是以海明威小说的方式)以获得好的答案。实际上,最好有一些代码。
  • @rokjarc - 实际上,在 ARC 之前,我们会确切地知道该告诉那个人该做什么 -- retain 对象,然后是 release 它不再需要时。由于 ARC,通常更难决定如何解决奇怪的情况。
  • @HotLicks:是的,这是真的。当时有责任的程序员对此也有更多的控制权。当新的(对于 obj-c 的)编码人员遵循旧的(和好的)教程时,我的评论实际上是由一些问题引起的。由于 ARC 通常使用 performSelector:afterDelay:0.1 修复了 80% 的故障 :)

标签: iphone ios objective-c xcode memory-management


【解决方案1】:

我只是分配/初始化 PieChartViewController 并将其视图添加到主视图。这通常工作正常

它可能工作正常,但不要这样做。这是对 UIViewController 的误用。在这里查看我的答案:https://stackoverflow.com/a/15962125/341994

【讨论】:

  • 这样做是否可以接受实际上是我的另一个问题,感谢您的澄清。你会如何建议这样做?图表需要一个代表来管理其数据和外观。我希望每个图形都包含在一个对象中,它们的数据和名称以及我与它们一起使用的一些手势都存储在一起,而不必处理来自父视图控制器的多个图形的数​​据。这就是为什么我选择添加几个视图控制器,就好像它们是 UI 元素一样。有什么建议吗?
  • 看看我给你的链接。您可以创建自己的视图控制器及其视图的层次结构,但您必须以正确的方式进行,使用正确的父子视图控制器架构并在操作视图时发送所有正确的消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多