Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 简单的应用程序结构。你怎么认为?_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone 简单的应用程序结构。你怎么认为?

Iphone 简单的应用程序结构。你怎么认为?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我对保留属性的方式和内存管理方面感兴趣。这适用于编辑存储在表中的类信息的简单应用程序。有3个视图控制器 列表视图(列出所有类) 所选项目的详细视图 (列出选定类的属性) 编辑视图(列出单个属性 所选类别的,并允许 (编辑) 这就是它目前的结构,你怎么看 ListViewController @属性(非原子,保留)NSMutableArray*池 @属性(非原子,保留)PoolFacilityEdit控制器*childController 要将新类实例添加到表中,请单击运行此方法的“添加”按钮

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

  • 列表视图(列出所有类)
  • 所选项目的详细视图 (列出选定类的属性)
  • 编辑视图(列出单个属性
    所选类别的,并允许 (编辑)
这就是它目前的结构,你怎么看

ListViewController

@属性(非原子,保留)NSMutableArray*池
@属性(非原子,保留)PoolFacilityEdit控制器*childController

要将新类实例添加到表中,请单击运行此方法的“添加”按钮

//Loads up the editPoolFacility controller to add a new pool
-(作废)添加{

}

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

详细视图

@property (nonatomic, assign) PoolFacility *thePoolFacility; (assigned in the above add method)
@属性(非原子,赋值)NSMutableArray*池;(也在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;
@财产(非原子,分配)池设施*池设施

它会创建一个副本进行编辑,以防用户更改值,然后想要取消。如果用户按save,则会将值从副本复制到非副本

- (void)viewWillAppear:(BOOL)animated {

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

如果按“保存”或“取消”,则会弹出视图

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

现在,如果用户按下save,我就弹出ViewController,我们回到列表视图。或者,如果用户按cancel,我将运行此方法

-(void)cancel {

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

总而言之

我在不同的视图控制器中指定属性,而不是保留它

此外,“我的视图”控制器仅加载一次,在“消失”时不会解除分配

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

谢谢


Dan

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

  • 在iPhone操作系统中,取消按钮在用于添加新项目的对话框中很常见,但在编辑对话框中就更少了。事实上,我能想到的编辑对话框上唯一一个取消按钮的例子就是时钟应用程序的报警面板。因此,不必担心复制PoolFacility并在保存时将更改复制回来;只需使“取消”按钮仅对新对象可见(或者使用垃圾箱图标——取消新池和删除现有池实际上是与当前设计的操作相同的操作)

  • 正如您现在拥有的一样,不会有在错误的时间释放对象的危险。然而,如果你改变了存储方法——例如,让应用程序从磁盘上懒洋洋地加载PoolFacility对象——它就会回来咬你。今天把它写好,明天你就能省去痛苦。正确的方法是将thePoolFacility设置为保留属性,并在dealloc方法中释放它。(如果您继续以当前的方式管理池列表,您应该对其执行相同的操作。)

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

  • 因为只有一个池列表,而且多个控制器都需要它,所以将它存储在应用程序代理中而不是将其传递给其他人并不丢脸。更好的是,编写一个FacilityList单例对象来管理列表。这可以让您从控制器中获取大量逻辑。通常,除了与屏幕交互的内容外,您应该尽可能地将所有内容放入模型中。这意味着,当苹果制作iTablet或发布Apple TV SDK时,或者当你决定制作Mac版本或重做用户界面时,你可以在未经修改的情况下尽可能多地使用你的应用程序


  • 谢谢你,布伦特。是否有任何在线代码示例以您上面描述的方式显示通知的使用?
    -(void)cancel {
    
    [self.pools removeObject:self.thePoolFacility];
    [self.navigationController popViewControllerAnimated:YES];