具有委托(delegate)和父对象的 iOS 设计模式内存管理

标签 ios delegates release design-patterns

我正在努力以一种非常干净的方式解决涉及内存过载(管理)的问题。 我有一系列包含其他 View 的 View ,在我的项目中我有这样的情况:

主视图

|_页面 View

|_自定义按钮

太好了,太简单了。由于某些原因,CustomButton 中有一个委托(delegate)(协议(protocol)),所以我们在 PageView 中有一个创建 N 个 CustomButtons 的“for 循环”,在 PageView 中将委托(delegate)设置为 self(PageVew 扩展 CustomButtonDelegate)并在附加它们后释放按钮,例如

{
CustomButton *customButton_ = [[CustomButton alloc] initWithFrame:CGRectMake(100.0,50+(i*55.0),200.0);
customButton.delegate = self;
[self addSubView:customButton_];
[customButton_ release];
}

太好了。按钮将被按下,PageView 获取协议(protocol)方法,执行一些代码,瞧,完成。一个问题是,在某一时刻,MainView 必须删除 PageView,所以在我调用的方法中

[pageView_ removeFromSuperview];
[pageView release], pageView_ = nil;

pageView_ = [PageView alloc] initWithFrame.....];

然后我用其他要显示的数据重新创建对象。 我注意到 PageView 永远不会从内存中释放和删除,因为它的 retainCount 正是我在 PageView 中创建的 CustomButton 的数量,并将委托(delegate)分配给 self 再加上一个。我的问题是,安全删除所有对象并能够删除 PageView 的最干净的方法是什么,释放内存(因为我加载了大量数据以在其中显示)?

现在我在做:

在PageView中创建一个NSMutableArray,即我CustomButton中的对象 它,在删除 PageView 之前,我循环它并设置 delegate = nil 然后释放 每个对象,在我释放 NSMutableArray(称为“holder”)之后。

但问题是,如果我想用其他协议(protocol)添加更多不同类型的对象,添加到这个数组中,可能会导致保留对象的其他问题。

我哪里缺少人手和知识,所以我需要学习更多(我可以肯定地说),或者我是否需要接触另一个 OOD?

谢谢你们,我正在处理这个问题,我的大脑陷入了困境。 :)

最佳答案

看起来您的CustomButton 的委托(delegate)是CustomButtonretain 属性。 Delegate 应该是 assign 属性,而不是 retaincopy。参见 here .

关于具有委托(delegate)和父对象的 iOS 设计模式内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7790172/

相关文章:

ios - Collection View 单元格边框颜色在 Swift 3 中取消选择

Groovy:将 toString 调用委托(delegate)给 String 字段的 AST 转换

iphone - 从 NSInvocation 或 NSNotificationCentre 或 Delegate 方法中使用哪个更好

objective-c - 如何在 UITabBarController 中仅为一页添加 TTTableViewDragRefreshDelegate?

c++ - 使用 "maximize speed"但不是 "minimize size"的堆问题

ios - Swift - 覆盖 UIViewController 与 UITableViewController 中的函数

ios - 自动播放 URL 中的 mp3

iphone - 如何在 UItableview 下使用 UItableview 创建 Accordion ?

iphone - 在 Objective-C 中释放对象的正确方法是什么

c++ - 调试版本运行但发布给出 0xc000007b - 缺少 dll?