0

私は最近、sqlite3 データベースを使用する大規模なプロジェクトを継承しましたが、現在、全体に散在する大量のメモリ リークに対処しています。いくつかのリークは、それらを解決できなかった後、私を混乱させ、意気消沈させました。メソッド内のこのループは大量のバイトをリークしますが、非常に単純に見えるため、リークを防ぐためにループを変更する方法がわかりません。

...
    while ((ret=sqlite3_step(selStmt))==SQLITE_ROW) 
    { 

        GraphData *item = [GraphData alloc];

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

        [newData addObject:item]; 

        [item release], item = nil;

    }
...

    @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



    #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;

}

@end

このデータソース クラス内のほとんどすべてのリークは、このループから発生しています。

これが私の経験不足が見落とした些細なことであることを願っています。

私の質問を見てくれてありがとう。

4

1 に答える 1

0

GraphData クラスに割り当て解除はありません。

- (void)dealloc {
    [value release];
    [super dealloc];
}

release(最初のコード スニペットに含まれているため、ARC を使用していないと思います。ARC に変換することを強くお勧めします。この種のリークはなくなります。)

于 2012-06-13T10:12:11.007 に答える