iOS:什么时候最好在视图控制器中取消分配模型对象?

问题描述

| 我在这里一个很基本的问题。我发现我经常在视图控制器的viewDidLoad:方法中实例化模型对象,例如,在用于填充视图控制器中表元素的Web服务对象的情况下:
- (void)viewDidLoad {
    [super viewDidLoad];    
    itemService = [[BlogItemService alloc] init];
}
我应该在哪里发布itemService?在viewDidUnload或dealloc吗? 此外,在viewDidLoad中分配这样的对象是否常见?没有更合适的初始化类型方法吗? 更新:我特别担心。假设我在dealloc中取消了itemService。如果先卸载视图然后再加载,但是视图控制器未释放,那么在实例化新实例时,我是否会发生内存泄漏,因为itemService的先前实例被孤立了?     

解决方法

这是非常罕见的情况,但是如果您先卸载然后再次加载视图,则将按照您的建议进行泄漏。因此,在哪里分配对象是一个很好的问题,它取决于您的选择。可能最好在每次视图加载时加载非常重的对象,而视图很小时,某些小对象可能更容易在init中加载。但是,如果您想多次加载和卸载视图,则还必须谨慎处理视图控制器,因为常见的模式是每次视图消失时都销毁控制器(并且大多数情况下这是一个好的解决方案)。     ,  我应该在哪里发布itemService?在viewDidUnload或dealloc吗? 如果对象是轻量级的或创建时间很长,请在dealloc中进行操作。如果它消耗大量内存,则在viewDidLoad / viewDidUnload中使用匹配对。   此外,在viewDidLoad中分配这样的对象是否常见? 是   没有更合适的初始化类型方法吗? 指定的初始化程序(在某些情况下)   更新:我特别担心。假设我在dealloc中取消了itemService。如果先卸载视图然后再加载,但是视图控制器未释放,那么在实例化新实例时,我是否会发生内存泄漏,因为itemService的先前实例被孤立了? 为了避免这种情况,请使用:
BlogItemService * item = [[BlogItemService alloc] init];
self.itemService = item;
[item release],item = nil;
    ,您应该在dealloc中释放对象 您可以使用以下方式分配内存:
itemService=[BlogItemService new];  
    ,如果您问我初始化模型对象的最佳位置,则是在类的
init
方法中,而在
dealloc
中则是
release
。