Каков идеальный способ вернуть данные из функции без утечки памяти?

#iphone #objective-c

#iPhone #objective-c

Вопрос:

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

Ответ №1:

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

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

// Call database function here...

[pool release];
  

Обратитесь к документации пула автоматического освобождения здесь

Ответ №2:

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

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

Ответ №3:

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

Ответ №4:

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

Ответ №5:

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

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

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

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

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

 -(void) operateOnUsers {
  NSMutableArray *array = [NSMutableArray new];
  [self getMoreUsers:array];
  // do stuff that will not retain array
  [array release];
}