2009-02-25 23 views
4

我有一个类是负责和建立我的模型对象的所有者。它为模型分配内存并保留它们,并在发生dealloc时负责释放它们。我是否在iPhone上发布这个实例变量?

现在我有一个相应的UIViewController,在这种情况下充当客户端。它将有几个实例变量,指向它需要的模型。它不需要为他们分配内存,因为负责这样做的类已经完成了它。我仍然需要从客户端释放内存吗?这里有一个例子

ModelHolder.m将有类似

- (NSArray *)modelA 
{ 
    if (modelA == nil) { 
     modelA = [[ModelClassA alloc] init]; 
    } 

    return modelA 

} 

- (void)dealloc { [super dealloc]; [modelA release]; } 

现在ClientViewController都会有类似的东西:

@class myModelA; 
@interface ClientViewController : UIViewController { 
    ModelClassA myModelA; 
} 

// more code 
@end 
#import "ModelHolder.h" 
@implementation ClientViewcontroller ...... etc 
- (void)viewDidLoad 
{ 
    self.myModelA = [instanceOfModelHolder modelA]; 
} 
- (void)dealloc { 
    // am I responsible to release here? 
} 

请不要介意任何语法错误,我刚才写的上飞在这里。尽管如此,我认为我的观点在代码中表现得很好。

谢谢。

回答

4

假设你宣布ClientviewController的modelA财产或者@property(retain)@property(copy),或@property(mutableCopy),你保留该财产的价值,所以你必须将其释放。

2013年编辑:假设你没有使用ARC。 ARC会为你做这件事,所以通常根本不需要在ARC下实现dealloc。当不使用ARC时,你需要释放你拥有的所有东西。

0

你应该把[super dealloc];最后在自己的dealloc。

- (void)dealloc 
{ 
    [modelA release]; 
    [super dealloc]; 
} 

至于你提到,在过去的dealloc释放的问题这取决于你如何指定@property myModelA,它是一个“保留”或“复制”属性,你应该做的释放。它是一个“副本”,你实际上负责一个新对象。

+0

权,正如我所说,不介意任何缺失。就内存管理而言,原始问题仍然存在。 – Coocoo4Cocoa 2009-02-25 18:48:37

+0

刚才输入了它...... :) – epatel 2009-02-25 18:50:06

0

你应该已经做了这个谎言

- (void)viewDidLoad 
{ 
    ModelClassA *myModelA = [instanceOfModelHolder modelA]; 
    self.myModelA = myModelA; 
    [myModelA release]; 
} 

由于释放任何别的地方可能会导致内存泄漏,有时甚至导致应用程序崩溃,如果引用计数没有适当的照顾。

也请注意,你还没有做出ModelClassA myModelA;属性,所以你应该避免释放它的dealloc中,直到你确信它已经引用计数大于1

相关问题