Подтвердить что ты не робот

Авторейтинг или не автореферат

В следующем примере кода из Руководства по программированию основных данных создается NSFetchRequest с autorelease, в то время как NSSortDescriptor не создается с авторекламой. Почему NSSortDescriptor не создан с авторекламой? Это вопрос предпочтения?

NSManagedObjectContext *moc = [self managedObjectContext];    
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" 
                                                     inManagedObjectContext:moc];

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
// Set example predicate and sort orderings...
NSNumber *minimumSalary = ...;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(lastName LIKE[c]'Worsley') AND (salary > %@)", minimumSalary];    
[request setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" 
                                                               ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[sortDescriptor release];
NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
if (array == nil){
    // Deal with error...
}
4b9b3361

Ответ 1

Когда вы autorelease, вы, в основном, говорите: "Мне это больше не нужно, но кто-то может свободно его поднять (до того, как пул автовыпусков будет удален)". Когда вы явно передаете объект, который вы говорите: "Мне это больше не нужно, и если кто-либо еще не сказал об этом (приобретенный), он должен быть немедленно освобожден".

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

Ответ 2

Автореферат или не автореклама

Этот есть вопрос.

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

Я не мог с собой поделать. Я возьму репутацию. Я ничего не жалею!

Ответ 3

Объект запроса будет возвращен вызывающему, тогда как sortDescriptor используется и затем отбрасывается.

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

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

Документ Apple по управлению памятью превосходный и заслуживает тщательного чтения. http://developer.apple.com/iPhone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Ответ 4

Вопрос в следующем: как использование autorelease или release влияет на время жизни объекта?

В обоих примерах это не имеет никакого значения.

Оба NSFetchRequest и NSSortDescriptors будут жить до конца метода, независимо от того, выпущены ли они или автореализованы.

Если вы создаете экземпляр объекта и затем передаете его другому объекту (скажем, NSArray), он останется в живых, независимо от того, вызываете ли вы выпуск или автозапуск.

Ответ 5

Как сохранение, так и автореферат, функционально сохраняют объект, но не сливаются. Различия заключаются в том, что удержание счета может быть уменьшено только другим объектом, тогда как автореализованные подсчеты автоматически уменьшаются, когда NSAutoreleasePool сливается. Если ни один другой объект не сохранил автореализованный объект к тому времени, когда пул сливается, он переходит в пуф.

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

В вашем примере кода autorelease - это всего лишь мера безопасности. Объект NSPredicate освобождается, поскольку его работа завершена, но кодер хотел убедиться, что объект NSFetchRequest зависает. Вам не нужно использовать "autorelease" в этом случае, но если вы потеряли счет ваших релизов, fetchRequest может исчезнуть. С другой стороны, вы не хотите, чтобы это осиротело и просачивалось, поэтому вы используете авторекламу для очистки, когда пул объекта находится в канализации.

Наиболее распространенное использование авторекламы - это когда вы каждый раз создаете переменное количество объектов. Вы не хотите, чтобы отслеживать их все, чтобы вы их авторекламировали, и пусть бассейн позаботится о них. (Еще лучше, вы создаете локальный пул и слейте его, как только закончите.)

В стандарте Apple API любой метод, который создает новый объект без ключевых слов "init", "new" или "create", возвращает объект с автореализацией.

-[NSString initWithString:] не является autorelease, но - [NSString stringWithString:]. Это вызывает проблемы в средах сбора данных, отличных от мусора, потому что stringWithString: возвращает строку, которая, как представляется, ведет себя как сохраненный объект, но позже она внезапно исчезает, казалось бы, случайным образом, когда пул авторесурсов был создан в стоках.


Edit01: из документов Apple

Пул авторекламы - это пример NSAutoreleasePool, который "содержит" другие объекты, получившие сообщение автореферата; когда autorelease pool освобождается отправляет сообщение о выпуске для каждого из эти объекты. Объект может быть помещен в пул автореферата несколько раза и получает сообщение о выпуске за каждый раз, когда он был помещен в бассейн. Таким образом, отправка автореферата вместо выделения объекту продлевает время жизни этого объекта в до тех пор, пока сам пул не станет (объект может выжить дольше, если он сохраняется в промежуточный).

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