2012-06-13 43 views
0

我目前正在通过一些内存泄漏进行对抗,并且遇到了一些严重的问题,并且还没有解决我离开的最后一个问题。泄漏仪器出于各种不同原因显示几个泄漏都来自相同的方法,主要归因于NSCFString,NSMutableArray和我称为GraphData的类。我试图用几种不同的方法解决这个问题,所以希望能够解决这个问题,希望这个问题很简单,我忽略了。内存泄露sqlite iOS应用程序

下面是一些代码:

// the offending, leaking method 
-(NSMutableArray*)fillDataInArray:(NSInteger)keyphrase_id{ 

    NSLog(@"Keyphrase_id:%d", keyphrase_id); 

    NSDate *startdate = [self getDateForApplicationInstalled]; 
    NSDate *enddate = [NSDate date]; 

    NSString *dateString1=[[NSString alloc] initWithString: [fmt stringFromDate:startdate]]; 
    NSString *dateString2=[[NSString alloc] initWithString: [fmt stringFromDate:enddate]]; 

    NSMutableArray *newDataNew = [[NSMutableArray alloc]init]; 
    self.newData = newDataNew; 
    [newDataNew release]; 

    selStmt = nil; 

    if (!selStmt) 
    { 
     const char *sql = "select distinct position, key_time from ranking where keyphrase_id = ? and key_time between ? and ? order by key_time"; 

     if (sqlite3_prepare_v2(database, sql, -1, &selStmt, NULL) != SQLITE_OK) 
     { 
      selStmt = nil; 
     } 

     NSInteger n = keyphrase_id; 
     sqlite3_bind_int(selStmt, 1, n); 

     sqlite3_bind_text(selStmt, 2, [dateString1 UTF8String] , -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(selStmt, 3, [dateString2 UTF8String] , -1, SQLITE_TRANSIENT); 

     NSLog(@"SQL query is: [%s]", sql); 
    } 
    if (!selStmt) 
    { 
     NSAssert1(0, @"Can't build SQL to read keyphrases [%s]", sqlite3_errmsg(database)); 
    } 

    int ret; 

    while ((ret=sqlite3_step(selStmt))==SQLITE_ROW) 
    { 
     GraphData *item = [[GraphData alloc]init]; 

     item.key = sqlite3_column_int(selStmt, 0); 
     item.value = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selStmt,1)]; 

     [newData addObject:item]; 

     [item release], item = nil; 
    } 

    sqlite3_reset(selStmt); // reset (unbind) statement 

    [dateString2 release]; 
    [dateString1 release]; 

    return newData; 
} 

//GraphData.h 
@interface GraphData : NSObject{ 
    NSInteger key; 
    NSString *value; 
} 

@property (nonatomic, readwrite) NSInteger key; 
@property (nonatomic, retain) NSString *value; 

-(id)initWithPrimaryKey:(NSInteger) xid; 
-(id)initWithName:(NSString *)n key:(NSInteger)i; 

@end 

//GraphData.m 
#import "GraphData.h" 

@implementation GraphData 

@synthesize key,value; 

-(id)initWithPrimaryKey:(NSInteger) xid{ 

    self.key = xid; 
    self.value = @""; 

    return self; 

} 
-(id)initWithName:(NSString *)n key:(NSInteger)i{ 

    self.key = 0; 
    self.value = n; 

    return self; 

} 
-(void)dealloc{ 


    [value release], value = nil; 
    [super dealloc]; 

} 

@end 

感谢您看我的帖子!

回答

0

泄漏工具告诉你泄漏的物体在哪里已创建。由于NSCFString,NSMutableArray和GraphData对象从这个方法泄露,让我们来看看如何发生这种情况。

您只能在NSMutableArray中插入GraphData对象(包含字符串对象),并且它们似乎被正确释放。因此,要泄漏在此方法内创建的GraphData对象,包含元素的数组必须是泄漏。

请检查方法的调用者。我假设其中一个正在保留(而不是释放)该方法的返回值。

此外,您的初始化程序必须更改为调用super的init,但这与泄漏无关。一个例子:

-(id)initWithPrimaryKey:(NSInteger) xid 
{ 
    self = [super init]; 
    if (self) { 
     self.key = xid; 
     self.value = @""; 
    } 
    return self; 
} 
+0

该方法的调用者似乎保留了他们的方法调用的返回值,所以希望你已经用该答案击中了头部的指甲!不过,我现在要回家以后要明天检查一下。虽然谢谢! – Jace