【问题标题】:issue about subview retain superview in objective-C关于 subview 在 Objective-C 中保留 superview 的问题
【发布时间】: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]吗?

【问题讨论】:

    标签: objective-c memory-management ios


    【解决方案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项目时自动创建的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多