【问题标题】:Memory leak sqlite iOS application内存泄漏 sqlite iOS 应用程序
【发布时间】:2012-06-16 14:53:06
【问题描述】:

我目前正在与一些内存泄漏作斗争,并且在解决我剩下的最后一个问题时遇到了一些严重的问题。泄漏工具显示了由于各种不同原因而全部来自同一方法的多个泄漏,主要归因于 NSCFString、NSMutableArray 和我创建的一个名为 GraphData 的类。我试图以几种不同的方式修复它,但都无济于事,因此希望可以对这个问题有所了解,希望这是我忽略的一些简单问题。

这里有一些代码:

// 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

感谢您查看我的帖子!

【问题讨论】:

    标签: ios memory sqlite nsmutablearray memory-leaks


    【解决方案1】:

    泄漏工具告诉您泄漏对象是在哪里创建的。由于 NSCFString、NSMutableArray 和 GraphData 对象是从这个方法中泄露出来的,让我们看看这是怎么发生的。

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

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

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

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

    【讨论】:

    • 方法的调用者似乎保留了他们方法调用的返回值,所以希望你已经用这个答案一针见血了!不过我明天要检查,因为我现在要回家了。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多