2012-02-21 96 views
0

谁能告诉我为什么这是方法给我泄漏?我一直在寻找它的历史,并不知道为什么它泄漏。泄露的对象是ContactOperations。 EventType是Malloc和Release。我以为init可能是错的?Objective-C泄漏

联系控制器

ContactOperations *contactOps = [[ContactOperations alloc] initWithDatabase:database]; 
if ([contactOps applicationIsOwner]) 
    [contactOps startOperations];  
[contactOps release]; 

仪器说,ALLOC是给我的泄漏...

联系运营

ContactOperations 
- (id)initWithDatabase:(Database*)aDatabase 
{ 
    if (self = [super init]) 
    { 
     database = [aDatabase retain]; 
     parameter = [[Parameter alloc] init]; 
     parameter.database = aDatabase; 
     //addressBook = ABAddressBookCreate(); 
    } 
    return(self); 
} 



-(void)dealloc 
{ 
    [database release]; 
    [parameter release]; 
    //CFRelease(addressBook); 
} 
+0

您是否尝试过从Xcode内部进行静态分析? – trojanfoe 2012-02-21 09:20:39

+0

'contactOps'是否保留在' - [ContactOperations startOperations]'中?除此之外,您发布的代码中没有泄漏。 – Costique 2012-02-21 09:24:22

+0

愚蠢的问题:如果在发布后将'contactOps'设置为'nil',它是否仍然会发出警告?否则,您的技术上可以从您的代码中仍然可以访问过度发布的实例。 – Monolo 2012-02-21 09:24:23

回答

5
-(void)dealloc 
{ 
    [database release]; 
    [parameter release]; 
    //CFRelease(addressBook); 
} 

你已经忘记[super dealloc];- (void) dealloc的末尾。您必须致电[super dealloc]才能清除ContactOperations超类的实例变量。

+1

对。当使用引用计数而不是垃圾收集器时,这是必需的。 – ArjunShankar 2012-02-21 09:28:43

+0

我很精神,很合一。我在这方面浪费了几个小时。 – JonWells 2012-02-21 09:33:41