gpt4 book ai didi

objective-c - 调用 UIView 的 removeFromSuperview 是否足够,或者是否需要删除 UIViewController?

转载 作者:搜寻专家 更新时间:2023-10-30 20:04:59 26 4
gpt4 key购买 nike

我有一个主视图,它手动创建一个 UIViewController(不是 UINavigationController)并将该 Controller 的 View 添加为 subview 。

然后 subview 通过 [self removeFromSuperview] 关闭自己。我知道这会释放 View ,所以这很好,但是我现在也想摆脱我在删除 View 时立即分配的 UIViewController 以释放内存,而不是等到主视图 Controller 被释放.

我可以避免使用 removeFromSuperview 并反向引用主视图 Controller 并让它关闭 subview 并释放 Controller ,但感觉应该有更简洁的方法。

是否有实现此目标的既定最佳实践?

最佳答案

正确的方法是让你的子 Controller 请求主 Controller 移除它。如果你想减少两个 Controller 之间的耦合,为你的子 Controller 创建一个委托(delegate)协议(protocol):

// This forward declaration avoids having a circular dependency 
// between MySubcontroller and MySubcontrollerDelegate
@class MySubcontroller;

@protocol MySubcontrollerDelegate

- (void)hideMySubcontroller:(MySubcontroller*)subcontroller;

@end

如果子 Controller 有其他信息需要与 super Controller 通信,这里是添加相关调用的好地方。您可能不需要立即这样做,但请记住您的应用程序的 future 版本。

然后添加一个delegate子 Controller 的属性:

@interface MySubcontroller : UIViewController {
id <MySubcontrollerDelegate> delegate;
...
}
@property (assign) id <MySubcontrollerDelegate> delegate;
...
@end

而不是调用 removeFromSuperview在它看来,子 Controller 应该调用 hideMySubcontroller:在它的委托(delegate)上,通过 self作为参数。

然后你的主 Controller 应该声明它实现了委托(delegate)协议(protocol):

@interface MyMainController : UIViewController <MySubcontrollerDelegate>
...
@end

当主 Controller 创建子 Controller 时,应该设置子 Controller 的delegate属性(property)self .它应该实现 hideMySubcontroller:删除子 Controller View 、释放子 Controller 并执行任何其他需要的操作的方法。

使用委托(delegate)协议(protocol)意味着子 Controller 不必知道什么样的对象将使用它;它只知道某处有这样一个对象,并且它将符合委托(delegate)协议(protocol)。因此,两个 Controller 之间的耦合尽可能小。

顺便说一句,如果你能管理它,实际上最好把子 Controller 留在身边,以防你需要再次使用它;这将节省重新创建它所需的处理时间。 (但是,如果收到内存警告,则应释放它。)

关于objective-c - 调用 UIView 的 removeFromSuperview 是否足够,或者是否需要删除 UIViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/810194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com