【发布时间】: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