В чем разница между блоком 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