我是否在iPhone上发布了这个实例变量?

时间:2009-02-25 18:42:19

标签: iphone objective-c cocoa cocoa-touch

我有一个负责的类和构建我的模型对象的所有者。它为模型分配内存并保留它们,并负责在dealloc发生时释放它们。

现在我有一个相应的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?
 }

请不要介意任何语法错误,因为我刚刚在这里写了这个。我认为我的观点在代码中得到了很好的说明。

谢谢..

3 个答案:

答案 0 :(得分:4)

假设您将ClientviewController的modelA属性声明为@property(retain)@property(copy)@property(mutableCopy),您将保留该属性的值,因此您必须将其释放。

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

答案 1 :(得分:0)

你应该将[super dealloc];放在你自己的dealloc中。

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

关于你在最后一个dealloc中释放的问题,这取决于你如何指定@property myModelA,它是一个“保留”或“复制”属性你应该发布。它是一个“副本”,你实际上负责一个新的对象。

答案 2 :(得分:0)

你应该这样做谎言

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

如果引用计数没有得到正确处理,将其释放到其他任何可能导致内存泄漏的地方或有时甚至会使应用程序崩溃。

另请注意,您尚未将ModelClassA myModelA;作为属性,因此在确定其引用次数大于1之前,应避免将其释放到dealloc中。