2014-05-07 4 views
12

Я хочу знать, каковы различия между NSAutoreleasePool и блоком @autoreleasepool. Я рассмотрел ряд вопросов, но не получил удовлетворительного ответа. До сих пор я узнал, что в ARC мы не можем использовать NSAutoreleasePool и Блок @autoreleasepool может использоваться как в случае ARC enabled and disabled. Так что в каком отношении они отличаются друг от друга, чтобы вести себя таким образом.В чем разница между блоком NSAutoreleasePool и @autoreleasepool?

Нужно освободить объекты в электродуговой среде инвалидов, даже если мы используем NSAutoreleasePool или @autoreleasepool блок, или они будут делать это автоматически? Кроме того, если освобождение памяти ARC автоматически, то почему мы используем @autoreleasepool block.Please дайте мне краткий обзор с примером.

+3

Из документов яблока говорит, что если вы используете дуги вы не можете использовать NSAutoreleasePool вы должны использовать @autoreleasepool. Посмотрите далее на https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html – Sandeep

+0

Я видел это в приведенной выше ссылке: -Импорт: если вы используете Automatic Подсчет ссылок (ARC), вы не можете напрямую использовать пулы автозавершения. Вместо этого вы используете блоки @autoreleasepool. – Imran

+0

Возможный дубликат [Почему Xcode 4.2 использует @autoreleasepool в main.m вместо NSAutoreleasePool?] (Http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in- main-m-вместо-nsautoreleasepool) –

ответ

7

Одно из отличий вы упомянули:

В АРК мы не можем использовать NSAutoreleasePool и @autoreleasepool блок может использоваться в разблокированном как ARC и инвалидов случае.

Но твое это утверждение:

Кроме того, если память освобождения ARC автоматически, то почему мы используем @autoreleasepool блок

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

Вы можете обратиться в этом блоге Are @autoreleasepool Blocks More Efficient?

Нужно освободить объекты в электродуговой инвалидов среды несмотря на то, что мы используем NSAutoreleasePool или @autoreleasepool блок или они будут делать это автоматически?

Да Вам необходимо освободить объекты. Согласно определению (@/NS)autoreleasepool, он не обрабатывает ваш объект сохраняет отсчеты, но он используется только для следующих целей:

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

+1

Спасибо Anoop за ответ. Еще один вопрос: есть ли необходимость выпускать объекты в отключенной среде с дугой, даже если мы используем блок NSAutoreleasePool или @autoreleasepool или они сделают это автоматически? – Imran

2

Класс NSAutoreleasePool используется для поддержки системы управления памятью Cocoa. Пул авторезистов хранит объекты, которые отправляются сообщением release, когда сам пул сливается.

Кроме того, если вы используете автоматический подсчет ссылок (ARC), вы не можете использовать пулы автоматической регистрации напрямую. Вместо этого вы используете блоки @autoreleasepool.Например, вместо:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
// Code benefitting from a local autorelease pool. 
[pool release]; 

Вы бы написать:

@autoreleasepool { 
    // Code benefitting from a local autorelease pool. 
} 

@autoreleasepool блоки являются более эффективными, чем при использовании экземпляра NSAutoreleasePool напрямую; вы также можете использовать их, даже если вы не используете ARC.

Вы можете передать документ Apple, более подробно:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html