Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否在iPhone上发布此实例变量?_Iphone_Objective C_Cocoa_Cocoa Touch - Fatal编程技术网

我是否在iPhone上发布此实例变量?

我是否在iPhone上发布此实例变量?,iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,我有一个负责构建模型对象的类和所有者。它为模型分配内存并保留它们,并负责在dealloc发生时释放它们 现在我有了一个相应的UIViewController,它在本例中充当客户端。它将有几个实例变量,指向它需要的模型。它不需要为它们分配内存,因为负责分配内存的类已经这样做了。我仍然需要从客户端释放内存吗?这里有一个例子 ModelHolder.m将有如下内容 - (NSArray *)modelA { if (modelA == nil) { modelA = [[Model

我有一个负责构建模型对象的类和所有者。它为模型分配内存并保留它们,并负责在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?
 }
请不要介意任何语法错误,因为我刚刚在这里写了这篇文章。我认为我的观点在代码中得到了很好的说明


谢谢你。

你应该把
[super dealoc]您自己的dealloc中的最后一个

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

至于您在上次dealloc中关于发布的问题,这取决于您如何指定@property myModelA,您应该发布的是“retain”还是“copy”属性。它是一个“副本”吗?您实际上负责一个新对象。

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


从2013年开始编辑:假设您不使用ARC。ARC将为您实现这一点,因此通常根本不需要在ARC下实现
dealloc
。当不使用ARC时,您需要释放您拥有的一切。

您应该这样做

 - (void)viewDidLoad
 {  
     ModelClassA *myModelA = [instanceOfModelHolder modelA];
     self.myModelA = myModelA;
     [myModelA release];
 }
如果引用计数没有得到正确处理,那么在任何其他地方释放它都可能导致内存泄漏,有时甚至导致应用程序崩溃


还请注意,您没有制作
ModelClassA myModelA属性,因此您应该避免在dealloc中释放它,直到您确定它的引用计数大于1。

如我所述,不介意丢失任何内容。就内存管理而言,最初的问题仍然存在。
[instanceOfModelHolder modelA]
不应该返回您自己的引用,因此在分配后释放
myModelA
是错误的。提问者最初对该方法的实现是正确的
self.myModelA=…
只有在它是某种类型的属性时才起作用,无论是非正式的还是正式的,并且,无论哪种方式,该属性的setter可能都应该保留它;如果是这样,那么
dealloc
当然应该释放它。“其引用计数是否大于1”与您无关;如果您拥有它,那么您应该独立于程序中的任何其他内容来发布它。