Автовыпускать или не автовыпускать

В следующем примере кода из Базового Руководства по программированию Данных NSFetchRequest создается с автовыпуском, в то время как 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...
}
12
задан TechZen 29 January 2010 в 22:51
поделиться

5 ответов

Согласно Engadget, iPad запускает все приложения iPhone без изменений, что означает, что он поддерживает библиотеку Cocos2d.

Engadget

-121--3690535-
void PreviewTextInputHandler(object sender, TextCompositionEventArgs e)
{
    string sVal = e.Text;
    int val = 0;

    if (sVal != null && sVal.Length > 0)
    {
        if (int.TryParse(sVal, out val))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }
}
-121--928564-

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

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

35
ответ дан 2 December 2019 в 02:57
поделиться

Вопрос в том, как это: как использование AutoRelease или или влияет на время жизни объекта?

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

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

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

0
ответ дан 2 December 2019 в 02:57
поделиться

Убедитесь, что схема хранимой процедуры принадлежит к вашему хосту - это может быть, что это не в схеме «DBO».

E.G. Если он входят в outdoorsechema, ваш звонок должен быть «enversechemaechema.aspnet_checkschemaversion»

-121--808656-

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

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

В вашем примере кода Autorelease - это просто мера безопасности. Объект NSPredicate выделяется, потому что его работа закончена, но кодер хотел убедиться, что объект NSFetchrequest повесил вокруг. Вам не нужно использовать «Autorelease» в этом экземпляре, но если вы потеряли количество выпускаемых выпусков, это может исчезнуть Fetchrequest. С другой стороны, вы не хотите, чтобы он осиротел и утечку, поэтому вы используете авторелез, чтобы убрать, когда у бассейна объект находится в стоках.

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

в стандарте Apple API, любой метод, который создает новый объект без ключевых слов «init», «новый» или «создать» Возвращает аутоверенный объект.

- [NSSTRING INITWITHSTRINGSSTRING:] не является авторелереной, но - [NSSTRING StringWithString:]. Это вызывает проблемы в средах сбора мусора, потому что StringWithStringStringsString: Возвращает строку, которая, кажется, ведет себя как сохраненный объект, но позже он внезапно исчезнет, ​​казалось бы, казалось бы, когда бассейн Autorelease он был создан в стоках.


Edit01: из докусов Apple

AutoRelease Pool является экземпляром NSAutorElasePool, который «содержит» другие предметы, которые получили ауторелезное сообщение; когда Авторелез бассейна освобожден его Отправляет сообщение о выпуске каждому из эти объекты. Объект может быть положен в авторелез-бассейн несколько раз и получает сообщение о выпуске За каждый раз это было вложено в бассейн. Таким образом, отправка авторелез Вместо освобождения на объект продлевает срок службы этого объекта в хотя бы до самого бассейна выпущен (объект может выжить дольше, если он сохраняется в временный).

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

-1
ответ дан 2 December 2019 в 02:57
поделиться

К AutoRelease или не в авторелезе

, что - это вопрос.

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

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

26
ответ дан 2 December 2019 в 02:57
поделиться

Краткий ответ: Список . Вы можете найти документы здесь .

-121--2392173-

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

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

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

Документ Apple по управлению памятью является отличным и стоит тщательное чтение. http://developer.apple.com/iphone/library/documentation/cocoa/Coneptual/memorymgmt/memorymgmt.html

1
ответ дан 2 December 2019 в 02:57
поделиться