2010-05-28 4 views
0
NSString *strSql = @"select tblrecentsearch_id,xmlrequest,company,postcode,city,kilometer,date from tblrecentsearch"; 

returnValue = sqlite3_prepare_v2(database, [strSql UTF8String], -1, &selectStatement, NULL); 
if(returnValue == SQLITE_OK) 
{ 
    arrRecentSearch=[[NSMutableArray alloc] init]; 

    while(sqlite3_step(selectStatement)==SQLITE_ROW) 
    { 
    Search *ObjSearch = [[Search alloc]init]; 
    ObjSearch.intRecentSearchId = sqlite3_column_int(selectStatement, 0); 
    ObjSearch.xmlRequest = [NSString stringWithCString:(char *)sqlite3_column_text_check(selectStatement, 1) encoding:NSUTF8StringEncoding]; 
    ObjSearch.strCompnay=[NSString stringWithCString:(char *)sqlite3_column_text_check(selectStatement, 2) encoding:NSUTF8StringEncoding]; 
    ObjSearch.strPostCode=[NSString stringWithCString:(char *)sqlite3_column_text_check(selectStatement, 3) encoding:NSUTF8StringEncoding]; 
    ObjSearch.strPlace = [NSString stringWithCString:(char *)sqlite3_column_text_check(selectStatement, 4) encoding:NSUTF8StringEncoding]; 
    ObjSearch.strKilometer = [NSString stringWithCString:(char *)sqlite3_column_text_check(selectStatement, 5) encoding:NSUTF8StringEncoding]; 
    ObjSearch.strDate = [NSString stringWithCString:(char *)sqlite3_column_text_check(selectStatement, 6) encoding:NSUTF8StringEncoding]; 

    [arrRecentSearch addObject:ObjSearch]; 

    [ObjSearch release]; 
    } 
} 

sqlite3_finalize(selectStatement); 

Я хочу освободить arrRecentSearch, но он вернется из функции. Как я могу реализовать этот массив. Пожалуйста, помогите мне. Я получаю данные из базы данных.объект не освобождается в iphone

+1

возвращение [arrRecentSearch autorelease]; – hooleyhoop

ответ

1

просто autorelease его:

return [arrRecentSearch autorelease]; 

Посмотрите на apple memopry management guidelines для получения более подробной информации о том, как это работает

Если вы собираетесь вернуть autoreleased объект, вы должны помнить, чтобы сохранить его, если вам чтобы сохранить его позже. то есть, если у нас есть функция, которая возвращает autoreleased массиву

- (NSArray *) getSearchResults { 
    return [[[NSArray alloc] init] autorelease]; 
} 

и вы хотите запомнить результаты поиска по позже вы должны помнить, чтобы сделать это:

... 
NSArray *results = [[self getSearchResults] retain]; //!< Remember the retain here! 
... 

или, вы можете использовать свойство хранить:

@property (nonatomic, copy) NSArray *searchResults; 

... 
self.searchResults = [self getSearchResults]; //!< The property handles the retain for you here 
... 

в любом случае, если вы просто оставить его как autoreleased, это будет исчезать, и вы собираетесь получить исключение!

EDIT: Только что реализованный MustISignUp ответил на это в комментариях!

+0

Спасибо, но он порождает неперехваченное исключение – user344799

+1

Зачем? Является ли метод, который получает arrRecentSearch, помня, чтобы его сохранить? – deanWombourne

+0

autorelease - это правильный способ вернуть объект, но вызывающий должен положить его где-нибудь, что сохранит его, или он будет выпущен в следующий раз, когда пул авторесурсов будет удален. – progrmr

Смежные вопросы