【问题标题】:Simple application structure. What do you think?简单的应用程序结构。你怎么看?
【发布时间】:2009-02-13 18:04:26
【问题描述】:

我对保留属性的方式和内存管理方面很感兴趣。这适用于编辑存储在表中的类信息的简单应用程序。有 3 个视图控制器。

  • 列表视图(列出所有类)
  • 所选项目的详细视图 (列出所选类的属性)
  • 编辑视图(列出单个属性
    选定的类,并允许它是 已编辑)

目前的结构是这样的,你怎么看?

ListViewController

@property (nonatomic, 保留) NSMutableArray *pools;
@property (nonatomic, 保留) PoolFacilityEditController *childController;

要向表中添加新的类实例,请单击运行此方法的添加按钮。

//Loads up the editPoolFacility controller to add a new pool

-(void)添加 {

PoolFacilityEditController *editController = self.childController;

PoolFacility *aPoolFacility = [[PoolFacility alloc] init];

[self.pools addObject:aPoolFacility];
[aPoolFacility release];


editController.thePoolFacility = aPoolFacility;

editController.pools = self.pools;

[self.navigationController pushViewController:editController animated:YES];

}

下一个控制器现在已加载,这里是它有趣的实例变量。明智与否,我选择将池分配给新控制器而不是保留。我不想不必要地保留。

详细视图

@property (nonatomic, assign) PoolFacility *thePoolFacility; (assigned in the above add method)

@property (nonatomic, assign) NSMutableArray *pools; (也在add方法中赋值)

详细视图具有执行以下操作的方法..

- (void)viewWillAppear:(BOOL)animated {


//Pass the copy onto the child controller
if (self.childController.thePoolFacility != self.thePoolFacility) {
    self.childController.thePoolFacility = self.thePoolFacility;
}

}

池被传递到细节编辑控制器,因此它知道它正在编辑的池。

现在用户点击一个单独的池信息(例如名称),详细视图控制器会弹出。它允许编辑单个属性。

有趣的属性如下所示:

@property (nonatomic, retain) PoolFacility *thePoolFacilityCopy;

@property (nonatomic, assign) PoolFacility *thePoolFacility;

它会创建一个副本以供编辑,以防用户更改值然后想要取消。如果用户按下保存,它会将副本中的值复制到非副本中。

- (void)viewWillAppear:(BOOL)animated {

PoolFacility *poolCopy = [self.thePoolFacility copy];
self.thePoolFacilityCopy = poolCopy;
[poolCopy release];

}

如果按下保存或取消,视图会弹出。

然后我们回到显示所有字段的中间视图。

现在,如果用户按下保存,我只需弹出视图控制器,我们就会返回列表视图。或者,如果用户按下取消,我将运行此方法。

-(void)cancel {

[self.pools removeObject:self.thePoolFacility];
[self.navigationController popViewControllerAnimated:YES];

}

总结一下

我在不同的视图控制器中分配一个属性,而不是保留它。

另外,我的视图控制器只加载一次,并且在它们“消失”时不会被释放

我希望这有点道理!我的问题是..这是一个好方法吗?

谢谢,

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    我在这里没有看到具体的问题,所以我将做一些一般性的批评。

    1. 在 iPhone 操作系统中,取消按钮在用于添加新项目的对话框中很常见,但在编辑对话框中则更少。事实上,我能想到的编辑对话框上的取消按钮的唯一示例是在时钟应用程序的闹钟面板中。所以不用担心复制 PoolFacility 并在保存时将更改复制回来;只需使“取消”按钮仅对新对象可见(或使用“废纸篓”图标——取消新池和删除现有池实际上与现在的设计方式相同)。

    2. 既然你现在有东西,就不会有在错误的时间释放对象的危险。但是,如果您更改了存储方法——例如,让应用程序从磁盘延迟加载 PoolFacility 对象——它会回来咬你。今天写得好,明天你就不会痛苦了。正确的方法是使 thePoolFacility 成为保留属性并在您的 dealloc 方法中释放它。 (如果您继续按照当前的方式管理池列表,您应该对它执行相同的操作。)

    3. 说到这一点,您没有展示现有的 PoolFacility 对象是如何加载的。他们来自哪里?如果正在进行某种数据库访问,您可能会发现在创建、更新或删除对象时让 PoolFacility 发送通知很有帮助,然后根据需要观察并响应适当的通知。我编写的所有存储用户数据的应用程序都采用这种方法;我发现它非常方便和灵活。

    4. 由于只有一个池列表并且多个控制器都需要它,因此将它存储在应用程序委托中而不是传递它并不可耻。更好的是,编写一个管理列表的 FacilityList 单例对象。这可以让您从控制器中提取大量逻辑。通常,除了与屏幕交互的东西外,您应该将所有可以放入模型的东西都放入模型中。这意味着当 Apple 制作 iTablet 或发布 Apple TV SDK 时——或者当你决定制作 Mac 版本或重做用户界面时——你可以尽可能多地使用未经修改的应用程序。

    【讨论】:

    • 谢谢布伦特。是否有任何在线代码示例以您上面描述的方式显示通知的使用?
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多