NSArray объекты выходят из области видимости после возврата указателя - PullRequest
2 голосов
/ 28 августа 2010

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

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;

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Эта строка:

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

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

NSMutableDictionary* row = [[[NSMutableDictionary alloc] initWithCapacity:nColumns] ] autorelease];
0 голосов
/ 29 августа 2010

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

-(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];
}

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

...