Не удается определить утечку памяти iPhone / Objective-C при извлечении данных sqlite - PullRequest
0 голосов
/ 25 февраля 2012

Я пытаюсь выполнить некоторые базовые операции поиска таблиц из sqlite, и я все еще спотыкаюсь о некоторой утечке памяти, которую не могу понять, тем более что она появляется только с одной из двух эквивалентных строк.

То, что я делаю, просто:

-Создание объекта (категории) для хранения строки моего sqlite DB
-Имеет метод, который запрашивает sqlite и возвращает массив этих объектов

Я поместил весь код здесь (немного упростили, чтобы упростить, но у меня утечка памяти с этим самым кодом).

category.h:

@interface Category : NSObject {
    int         catId;
    NSString    *description;
    int         order;
    NSString    *iconName;
}

@property(nonatomic, readwrite, assign) int catId;
@property(nonatomic, retain) NSString *description;
@property(nonatomic, readwrite, assign) int order;
@property(nonatomic, retain) NSString *iconName;


@end

category.m:

#import "Category.h"


@implementation Category

@synthesize catId;
@synthesize description;
@synthesize order;
@synthesize iconName;

@end

Метод получения массива:

-(NSMutableArray *)getAll {

    NSString *query = "select id, description, catorder, image from category order by catorder";
    sqlite3_stmt    *statement;
    NSMutableArray  *categoryArray = [[NSMutableArray alloc] init];

    if (sqlite3_prepare_v2([[Database sharedDatabase] instance], [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            int     dbId =              sqlite3_column_int(statement, 0);
            char    *dbDescription =    (char *)sqlite3_column_text(statement, 1);
            int     dbOrder =           sqlite3_column_int(statement, 2);
            char    *dbIcon =           (char *)sqlite3_column_text(statement, 3);

            NSString *desc = [[NSString alloc] initWithUTF8String:dbDescription];
            NSString *icon = [[NSString alloc] initWithUTF8String:dbIcon];          

            Category *category = [[Category alloc] init];

            category.catId=dbId;
            category.description = desc;
            //category.description = @"Test";
            category.order = dbOrder;
            category.iconName = icon;
            //category.icon = @"test.png";

            [desc release];         
            [icon release];

            [categoryArray addObject:category];

            [category release];
        }
        sqlite3_finalize(statement);
    }
    [categoryArray autorelease];
    return categoryArray;
}

Эта строка пропускает

NSString *icon = [[NSString alloc] initWithUTF8String:dbIcon];          

Эта строка не

NSString *desc = [[NSString alloc] initWithUTF8String:dbDescription];

Вот что показывает инструмент: enter image description here

и когда я углубляюсь: enter image description here

1 Ответ

2 голосов
/ 26 февраля 2012

У вас нет метода dealloc.Это должно быть в вашем файле Category.m:

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

Кроме того, я почти уверен, что у вас не может быть свойства с именем "description".Это зарезервированное имя метода.

...