收集内存泄漏

时间:2011-12-05 06:32:12

标签: iphone objective-c xcode

请查看以下代码。

     XmlManipulatorObject=[[xmlManipulator alloc] init];
     self.QuestionMutableArray=[[XmlManipulatorObject ReadXml] init];
     self.dictionary=[[NSMutableDictionary alloc]init];

     self.dictionary=[QuestionMutableArray objectAtIndex:reloader];

在我的dealloc方法中,我需要释放我正在使用的所有对象。应该是什么方式?

我试过以下但是有BAD_ACCESS:

   -(void)deallocAll
    {

       [self.dictionary release];
       [self.XmlManipulatorObject release];
       [self.QuestionMutableArray release];

   }

,属性如下:

    @property(nonatomic,retain)NSMutableDictionary *dictionary;
    @property(nonatomic,retain)NSMutableArray *QuestionMutableArray;
    @property(nonatomic,retain)xmlManipulator *XmlManipulatorObject;

4 个答案:

答案 0 :(得分:3)

好的,你有很多错误/坏主意发生在这里:

  1. 变量和方法名称应以小写字母开头。这有助于提高可读性并避免与类名混淆。所以XmlManipulatorObject应该是xmlManipulatorObject,ReadXml应该是readXml等。

  2. 创建类的实例时,您应该自动释放它或手动释放它。例如:

    self.dictionary=[[[NSMutableDictionary alloc] init] autorelease];     
    

    NSMutableDictionary *myDic = [[NSMutableDictionary alloc]init];
    self.dictionary=myDic;
    [myDic release];
    
  3. 从上面看,您似乎也不知道属性处理保留和释放的方式。做一些关于属性的阅读。

答案 1 :(得分:2)

有时在完成使用它们之后立即释放对象要好得多,而不是在dealloc方法中。

此外,您应该使用默认的dealloc方法。

此外,由于你从未调用过dealloc super方法,所以你不会释放任何内存。

-(void)deallocAll
{
   [self dealloc];

   [self.dictionary release];
   [self.XmlManipulatorObject release];
   [self.QuestionMutableArray release];

}

我甚至会把这个从deallocAll更改为dealloc。

答案 2 :(得分:1)

drekka是对的。你也应该注意以下几点,

如果您使用的是合成属性,请将变量设置为nil而不是释放它。

self.yourObject = nil;

这会将setter方法'nil'作为参数发送,你的对象将由setter方法释放。

答案 3 :(得分:0)

我不知道deallocAll的目的是什么。那是迄今为止我为这个案例学到的最好方法:

NSObject *ob = [[NSObject alloc] init];
self.myObject = ob;
[ob release];

在dealloc中

-(void)deallocAll{
[super dealloc];
[myObject release];   

}