2009-02-13 39 views
1

我对保留我的属性和内存管理方面感兴趣。这是一个简单的应用程序,用于编辑存储在表中的类的信息。有3个ViewController。简单的应用程序结构。你怎么看?

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

这是它如何构造目前,你怎么看?

ListViewController

@属性(非原子,保留)的NSMutableArray *池;
@property(nonatomic,retain)PoolFacilityEditController * childController;

一类新实例添加到您点击运行此方法添加按钮表..

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

- (无效){添加

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) 

@属性(非原子,分配)的NSMutableArray *池; (也被分配在添加法)

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

- (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; 

@属性(非原子,分配)PoolFacility * thePoolFacility;

它创建一个副本以便在用户更改值然后取消时进行编辑。如果用户按下保存,则将副本中的值复制到非副本中。

- (void)viewWillAppear:(BOOL)animated { 

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

}

如果保存或取消被按压被弹出的图。

然后我们又回到了显示所有领域的中间视图。

现在,如果用户按下保存我只是poptheviewcontroller,我们又回到了列表视图。或者如果用户按下取消我运行这个方法。

-(void)cancel { 

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

}

所以总结

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

而且我的视图控制器只加载一次,当他们“dissapear”

我希望这使得一些感觉,不会取消!我的问题是..这是做这件事的好方法吗?

感谢,

回答

2

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

  1. 在iPhone OS中,取消按钮在用于添加新项目的对话框上很常见,但在编辑对话框中却少得多。实际上,编辑对话框上的“取消”按钮的唯一示例就是时钟应用程序的“警报”面板。因此,不要担心复制PoolFacility并在保存时将更改复制回来;只需使“取消”按钮仅对新对象可见(或使用“废纸篓”图标 - 取消新的存储池并删除现有存储池实际上与现在设计的方式相同)。

  2. 正如你现在拥有的东西,有没有在错误的时间被释放对象的危险。但是,如果您更改存储方法 - 例如,让应用程序懒洋洋地从磁盘加载PoolFacility对象 - 它会回来咬你。今天写得很好,明天你就可以节省自己的痛苦。正确的方法是将PoolFacility设置为保留属性,并在您的dealloc方法中释放它。 (如果你按照你现在的方式管理池列表,你应该这样做。)

  3. 说到这一点,你不会显示如何加载现有PoolFacility对象。他们来自哪里?如果有某种数据库访问的事情,你会发现它有帮助的时候被创建,更新或删除的对象PoolFacility发送通知,然后观察,并根据需要作出反应,相应的通知。我写的所有存储用户数据的应用都采用这种方法;我发现它非常方便和灵活。

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

+0

谢谢布伦特。是否有任何联机代码示例以上述方式显示通知的使用? – 2009-02-14 16:30:39