2011-04-27 50 views
1

我有一个类A的标题在界面中的NSDictionary *data;,而不是一个属性。功能之间的内存问题

在一种方法中,我调用另一个返回NSDictionary的B类的另一种方法,我制作data = [class method],并且一切正常。

后来,当填充了data时,我尝试从另一个A方法访问data,并且应用程序崩溃。

如果我做在前面的方法上data一个保留:

data = [class method]; 
[data retain]; 

它所有的作品,但我现在有一个内存泄漏。为什么会崩溃?

回答

4

您在第一个案例中发生崩溃,因为返回的字典在您引用它之前已经取消分配;和第二种情况下的内存泄漏,因为您有-retain而没有相应的-release

返回对象的大多数方法返回autorelease d对象。这可以确保该对象将持续到当前运行循环结束,但当时该对象将被释放(这就是autorelease所做的)。所以,如果你想保持对象存活超过当前运行的循环,你必须把它保留下来:

data = [[class method] retain]; 

但是,一旦你保留一个对象,这是你的责任,将其释放。对于一个对象实例变量,做这种事的时候,通常是在-dealloc

-(void) dealloc { 
    [data release]; 
} 

现在,你也应该知道,如果你覆盖data与另一个值,你还必须确保旧值得到正确释放。这是使用属性的好处之一:你可以让编译器为你编写一些处理这个问题的函数。如果你的财产是财产retain,比

self.data = newvalue; 

会)release旧值,B)retain新值设定值,以及c)你的实例变量设置为新值。尽管如此,当你的对象被销毁时,你仍然必须在dealloc中自己释放这个值。

+2

不要忘记'[super dealloc];',只是为了在政治上是正确的。 :) – 2011-04-27 17:23:14

+0

确实,'[super dealloc]'总是一个好主意。 – 2011-04-27 17:49:37

0

为什么它是内存泄漏?如果我理解你的问题,你只需要在你的dealloc的A类方法中做[data release];