【问题标题】:Directed/indirected graph memory management?有向/无向图内存管理?
【发布时间】:2014-01-19 05:44:06
【问题描述】:

例如,我有 Edge 和 Node 类:

@interface Node

@property ... NSArray *edges;

@end


@interface Edge

@property ... Node *nodeFrom;
@property ... Node *nodeTo;

@end

我应该如何定义这些属性 - 分配/保留?因为如果我将它们定义为分配的,那么它们可能会过早释放它们的内存。但如果我将它们定义为保留者,那么它们可能是紧密相连的,因为它们相互保留。

如何解决这个问题?

【问题讨论】:

  • 听起来你想要垃圾回收。
  • 我唯一的想法是使用assign 定义所有属性并将所有这些对象的保留数组存储在某处。
  • edges 应该保留,因为它是您需要保留的数组本身(插入的对象将由数组保留)。我也会保留nodeFrom/To。声明一个dispose 方法,当你不再需要一个对象时释放你的保留属性。
  • 如果你的图没有循环,你可以把nodeFrom设为弱引用,问题就解决了。但是无向图在每个无向边上都有循环,这就是 gc 的用武之地。您编写的任何解决方案都将归结为您自己的 gc 实现。

标签: ios objective-c memory memory-management properties


【解决方案1】:

你可以这样设置,所以节点拥有自己的边:

@interface Node

@property (strong) NSArray *edges;

@end


@interface Edge

@property (weak) Node *nodeFrom;
@property (weak) Node *nodeTo;

@end

这样,当两个节点都被释放时,边将被释放。

no built-in way to notify the edges that a node has deallocated,所以你最终可能会得到一个只有一个节点的边缘。

对此有两种解决方案:

  1. 在依赖这个边缘之前检查nodeFromnodeTo 是否都设置了。
  2. -[Node dealloc] 中,遍历edges 数组并通知边缘该节点将被释放。然后边可以向另一个节点发送一条消息,表明它不再是有效边,而另一个节点可以解除分配无效边。

附带说明,NSSet 可能比NSArray 更适合edges,因为边缘是无序的。

【讨论】:

  • 但这会丢失任何未被边缘以外的东西引用的节点
  • 我假设所有节点都属于 Graph 类和一组 nodes。 (这也可以在-[Node dealloc] 中更新。)除非您已经引用了一个节点,否则您将如何找到任何节点?
  • 跟随边缘。以我的经验,像这样的图通常有几个链接到程序的其余部分,否则会自行管理(在需要信息时遍历它们)
  • 我认为这个答案对我来说已经足够了。这比遍历整个图(可能是多次)要好
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多