关于 subview 在 Objective-C 中保留 superview 的问题

Posted

技术标签:

【中文标题】关于 subview 在 Objective-C 中保留 superview 的问题【英文标题】:issue about subview retain superview in objective-C 【发布时间】:2010-10-19 00:42:08 【问题描述】:

这是内存管理问题。

假设我有一个视图 A,它有一个指向其子视图 B 的指针。我使用 @property(nonatomic, retain) 引用视图 B。

现在在子视图 B 中,我需要一个指针来指向它的父视图 A。所以我使用另一个 @property(nonatomic, retain) 来引用它的父视图 A。

这是我的担忧,我读过一篇文章Hold Me, Use Me, Free Me,关于目标 c 中的保留和释放内容。它提到了“保留周期”。所以它说子视图不需要保留其父视图,实际上如果这样做将是多余的。这是否意味着在我的示例中,子视图 B 只需要使用 @property(nonatomic) 来引用其父视图 A?谢谢!

顺便说一句,如果我没有在视图A的@property中写retain,我需要在dealloc方法中[viewA release]吗?

【问题讨论】:

【参考方案1】:

每个子视图已经有一个指向其父视图的指针。它由NSView 类管理。见-[NSView superview]。所以你可以只使用[self superview]self.superview 并完全忽略内存管理。

如果您出于任何原因想要继续,您需要指定 superview 属性是一个 assign 属性以避免警告。您也不会在-dealloc 中发布它,因为您从未保留它。

简单地说:子视图不拥有它们的父视图。

如果您正在为 ios 编写代码,只需将 NSView 替换为 UIView 并重新阅读即可。

【讨论】:

那么如果 View A 是一个 UIViewController 类(UIResponder->NSObject 的子类)呢?我试图添加一个子视图,它是一个 UIImageView(UIView 的子类)。因此,当我在子视图类中使用 self.superview 时,它并没有给我 UIViewController 类(我想要的),而是给了我 UIViewController.view。那么我该怎么做才能获得 UIViewController 类。 (其实是UIImageView的UIViewController.view类addSubview,而不是UIViewController类本身。所以在subView类中self.superView没有指向UIViewController类) 确切地说是值得的:视图控制器本身并不是一个视图,而是管理一个视图。视图在设计上不知道其控制器。它与控制器的通信由响应者链进行调解:用户交互在响应者链上冒泡,直到遇到处理程序。您可以使用-[UIResponder nextResponder] 自己走这条链。由于视图控制器拥有其受控视图,因此您仍然需要警惕导致保留周期 - 您仍然不希望子视图保留其父视图的控制器。【参考方案2】:

现在在子视图 B 中,我需要一个指向 指向它的父视图 A。

你已经有了一个。使用[self superview]

【讨论】:

【参考方案3】:

您的 UIView 不需要 UIViewController。你想做什么?如果您还没有,请阅读 Apple 的有关 Model-View-Controller 样式的文档。

【讨论】:

我的视图实际上是ViewController的视图,它是在我创建View-Based项目时自动创建的。

以上是关于关于 subview 在 Objective-C 中保留 superview 的问题的主要内容,如果未能解决你的问题,请参考以下文章

在没有 MonoTouch 托管类的情况下获取 Objective-C 类名

将 UIView 动画 Swift 代码翻译成 Objective-C

8关于viewWithTag

关于何时在 Objective-C 中发布的参考

关于 Objective-C 中的私有实例变量

Objective-C关于非ARC模式下的对象引用计数