Какой идеальный способ вернуть данные из функции без утечки памяти? - PullRequest
1 голос
/ 17 мая 2011

В IPhone Development ObjC мне интересно, как правильно использовать функции для возврата некоторых значений в словарях или массивах. Я имею в виду, должны ли они возвращать объекты автоматического выпуска, но не будет ли плохо, если я использую слишком много функций для возврата значений, например, функция getUserRecordsFromDB () вернет все пользовательские записи, поэтому они должны возвращать мне объекты автоматического выпуска? также, когда я звоню им несколько раз, предположим, что с интервалом в 4 секунды, чтобы получить недавно обновленные данные. Может кто-нибудь дать мне идеальный сканарий о том, как получить данные из функции, часто вызываемой в потоке программы, и не вытекать из памяти.

Ответы [ 5 ]

3 голосов
/ 17 мая 2011

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

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// Call database function here...

[pool release];

См. Документацию по пулу автоматических выпусков здесь

1 голос
/ 17 мая 2011

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

Также проверьте NSAutoreleasePool

0 голосов
/ 17 мая 2011

Вы всегда можете передать изменяемый объект для заполнения.

-(void) getMoreUsers:(NSMutableArray *)ioArray {
  for ( ... ) {
    NSMutableDictionary *user = [NSMutableDictionary new];
    // fill in user ...
    [ioArray addObject:user];
    [user release]; // explicit release so only reference is owned by ioArray
  }
}

Это дает вам явный контроль, когда вы знаете время существования объекта, но облегчает написание оболочки, когда выuse autorelease.

-(NSArray *) getUsers {
  NSMutableArray *result = [NSMutableArray array]; // implicit autorelease
  [self getMoreUsers:result];
  return result;
}

Пример использования этого с известным временем жизни:

-(void) operateOnUsers {
  NSMutableArray *array = [NSMutableArray new];
  [self getMoreUsers:array];
  // do stuff that will not retain array
  [array release];
}
0 голосов
/ 17 мая 2011

Вы должны придерживаться принципов программирования какао. Это место для начала , но по этому вопросу можно найти гораздо больше.

0 голосов
/ 17 мая 2011

Да, вы должны использовать автоматически освобожденные объекты в качестве возвращаемых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...