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