В чем разница между блоком NSAutoreleasePool и @autoreleasepool?

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

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

Ответ 1

Одно из упоминаний:

В ARC мы не можем использовать блоки NSAutoreleasePool и @autoreleasepool. использоваться как в случае с ARC-совместимым, так и с отключенным.

Но для вашего этого утверждения:

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

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

Вы можете ссылаться на этот блог Являются ли более эффективными блоки @autoreleasepool более эффективными?

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

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

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

Ответ 2

Класс NSAutoreleasePool используется для поддержки системы управления памятью Cocoa s. Пул авторесурсов хранит объекты, которые отправляются в сообщение 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