2010-08-28 7 views
2

Я пытаюсь использовать приведенный ниже код в функции для возврата массива объектов словаря. К сожалению, после возврата к следующей функции в стеке все строки в изменяемом массиве стали «недоступными». По моему мнению, массив должен автоматически сохранять объект строки (словаря) так, что даже после возвращения, где указатель строки выходит за пределы области видимости, объекты строки должны по-прежнему иметь счет сохранения 1. Что я здесь делаю неправильно? Как я могу построить этот массив таким образом, чтобы содержащиеся в нем объекты не освобождались?Объекты NSArray выходят из области видимости после возврата указателя

for (int i = 1; i < nRows; i++) 
{ 
    NSMutableDictionary* row = [[[NSMutableDictionary alloc] initWithCapacity:nColumns] ]; 
    for(int j = 0; j < nColumns; j++) 
    { 
    NSString* key = [[NSString stringWithUTF8String:azResult[j]] ]; 
    NSString* value = [[NSString stringWithUTF8String:azResult[(i*nColumns)+j]] ]; 

    [row setValue:value forKey:key]; 
    } 
    [dataTable addObject:row]; 
} 

return dataTable; 
+0

Пожалуйста, переформатируйте этот код (для удобочитаемости) и покажите нам, как вы создаете и поддерживаете dataTable. –

+0

Почему вы подразумеваете под «вне сферы действия»? Почему вы так странно используете NSMutableDictionary? – unbeli

+3

Как объявляется/определено dataTable? –

ответ

0

Из того, что я понимаю:

-(NSMutableArray*) getArrayOfDictionaries{ 
    int nRows=somenumber; 
    int nColumns=someOthernumber; 
    char **azResult=someArrayOfStrings; 

    NSMutableArray *dataTable=[[NSMutableArray alloc] init]; 
    for (int i = 1; i < nRows; i++) 
    { 
     NSMutableDictionary* row = [[[NSMutableDictionary alloc] initWithCapacity:nColumns]]; 
     for(int j = 0; j < nColumns; j++) 
     { 
     NSString* key = [[NSString stringWithUTF8String:azResult[j]] ]; 
     NSString* value = [[NSString stringWithUTF8String:azResult[(i*nColumns)+j]] ]; 

     [row setValue:value forKey:key]; 
     } 
     [dataTable addObject:row]; 
     //you should add the following line to avoid leaking 
     [row release]; 
    } 

    //watch for leaks 
    return [dataTable autorelease]; 
    //beyond this point dataTable will be out of scope 
} 

-(void) callingMethod { 
    //dataTable is out of scope here, you should look into arrayOfDictionaries variable 
    NSMutableArray* arrayOfDictionaries=[self getArrayOfDictionaries]; 
} 

Вы должны смотреть в локальную переменную в callingMethod вместо DataTable, который является локальным по отношению к методу я назвал getArrayOfDictionaries

1

Эта линия:

NSMutableDictionary* row = [[NSMutableDictionary alloc] initWithCapacity:nColumns] ]; 

следует использовать автореферат:

NSMutableDictionary* row = [[[NSMutableDictionary alloc] initWithCapacity:nColumns] ] autorelease]; 
Смежные вопросы