iPhone SDK: загрузка UITableView из SQLite - создание массива из SQLite - PullRequest
0 голосов
/ 13 октября 2009

это продолжение для iPhone SDK: загрузка UITableView из SQLite

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

@ interface Row: NSObject { int PK; NSString * desc;

}

@ property int PK; @property (nonatomic, retain) NSString * desc;

@ конец

операция загрузки будет похожа на эту:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:1];
Row *myRow = [[Row alloc] init];


for (int i=0; i<10; i++)
{
    myRow.PK = i;
    myRow.desc = [[NSString alloc] initWithFormat:@"Hello: %d", i];
    [array addObject:myRow];
}
[myRow release];

for (int i=0; i < [array count]; i++)
{
    Row *myNrow = [array objectAtIndex:i] ;
    NSLog (@"%@ %d", [myNrow desc], [myNrow PK]);
    myNrow = nil;
}

Конечно, первым циклом for будет цикл из инструкции SELECT. Другой цикл (или элементы этого цикла) будет находиться в методе cellInRowIndex для визуализации данных.

У меня вопрос по поводу утечек памяти. Имеет ли код выше утечки памяти? Свойство decs string класса Row объявлено как (retain). Разве это не должно быть выпущено где-нибудь?

Спасибо

1 Ответ

1 голос
/ 13 октября 2009

Вы должны освободить строку, которую вы помещаете в myRow.desc. Вы можете изменить

myRow.desc = [[NSString alloc] initWithFormat:@"Hello: %d", i];

до

myRow.desc = [[[NSString alloc] initWithFormat:@"Hello: %d", i] autorelease];

или

myRow.desc = [NSString stringWithFormat:@"Hello: %d", i];

РЕДАКТИРОВАТЬ: Если вы хотите использовать промежуточную строку NSString (как вы упомянули в комментарии), вы можете сделать это так:

NSString *foo = [[NSString alloc] initWithFormat:@"Hello: %d", i];
myRow.desc = foo;
[foo release];

или

NSString *foo = [NSString stringWithFormat:@"Hello: %d", i];
myRow.desc = foo;

Обратите внимание, что во втором примере foo уже выпущен автоматически, поэтому вы не должны его выпускать.

...