我是否在iPhone上发布此实例变量?
我有一个负责构建模型对象的类和所有者。它为模型分配内存并保留它们,并负责在dealloc发生时释放它们 现在我有了一个相应的UIViewController,它在本例中充当客户端。它将有几个实例变量,指向它需要的模型。它不需要为它们分配内存,因为负责分配内存的类已经这样做了。我仍然需要从客户端释放内存吗?这里有一个例子 ModelHolder.m将有如下内容我是否在iPhone上发布此实例变量?,iphone,objective-c,cocoa,cocoa-touch,Iphone,Objective C,Cocoa,Cocoa Touch,我有一个负责构建模型对象的类和所有者。它为模型分配内存并保留它们,并负责在dealloc发生时释放它们 现在我有了一个相应的UIViewController,它在本例中充当客户端。它将有几个实例变量,指向它需要的模型。它不需要为它们分配内存,因为负责分配内存的类已经这样做了。我仍然需要从客户端释放内存吗?这里有一个例子 ModelHolder.m将有如下内容 - (NSArray *)modelA { if (modelA == nil) { modelA = [[Model
- (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”与您无关;如果您拥有它,那么您应该独立于程序中的任何其他内容来发布它。