2013-07-21 3 views
0

Я довольно новичок в Obj-C, и я только начинаю создавать маленькие бесполезные программы, чтобы помочь мне в дальнейшем. Я хотел удостовериться, что у меня не было утечек памяти. Делает ли что-нибудь в «@autoreleasepool» автоматически освобождением его памяти, когда программа заканчивается?Objective-C @autoreleasepool?

Также, если есть какие-либо вредные привычки, пожалуйста, дайте мне знать!

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     Fraction* fractionOne = [[Fraction alloc]init]; 
     Fraction* fractionTwo = [[Fraction alloc]init]; 
     Fraction* fractionThree = [[Fraction alloc]init]; 

     [fractionOne setTo:1 over:2]; 
     [fractionTwo setTo:1 over:4]; 
     [fractionThree setTo:1 over:8]; 

     [Fraction numberOfFractions]; 

    return 0; 
    } 
} 

ответ

0

Это более или менее то, что он делает. Но не беспокойтесь: просто полагайтесь на ARC. Он управляет вашей памятью для вас!

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

Так что не беспокойтесь об этом! Ваш код в порядке :)

+1

Nah, это просто метод, который я сделал для создания метода класса. Он регистрирует количество объектов фракции. Спасибо за ответ! – user2350763

+0

ARC не «управляет» вашей памятью для вас »и думает, что это может привести к трудной отладке утечек памяти/сбоев. –

+0

Степень, в которой вы управляете им, - это «= nil» (и, вообще, думать о памяти в целом), но я имел в виду, что вы не можете явно освободить память. Как новичок, не стоит слишком беспокоиться о памяти. Когда вы начинаете делать приложения, вам нужно больше всего беспокоиться о том, нужно ли делать ссылку на сильную/слабую собственность. Я позволил ARC сделать это, и до сих пор у меня не было никаких проблем. – Macro206

0

С включенным ARC во время компиляции добавляется код, чтобы явно освободить fractionOne, Two и Three, чтобы они были выпущены с ARC. Без ARC, alloc создает сохраняемый экземпляр Fraction, и ваш код не выделяется явно (почти всегда лучше) или устанавливает их как autoreleased (почти всегда хуже).

Таким образом, без дуги вы просачиваетесь в течение нескольких миллисекунд, запущенных этой программой.

+0

Хорошо, так что @autoreleasepool доступен только с включенным ARC? Предположим, у меня не было этого, как бы освободить память? Можно ли все же освободить его, даже если ARC включен? – user2350763

+1

Он включен, когда вы объявляете его так же, как и вы, но не используете его, когда ARC обрабатывает код. С ARC on вы не делаете явного релиза, autorelease. Компилятор не позволит вам. – danh

3

См. Обсуждение Apple Using Autorelease Pool Blocks в руководстве по программированию расширенного управления памятью .

Короче говоря, нет, это не тот случай, что «все в @autoreleasepool автоматически освободить [с] его память, когда программа заканчивается» (или по крайней мере не в качестве функции @autoreleasepool). Целью создания пула авторекламы является контроль, когда память возвращается из авторекламы, то есть когда будет слит пул. Но в вашем образце кода не используются какие-либо автореализованные элементы, поэтому он здесь не применим (если только методы не использовали объекты автообновления внутри).

Наиболее распространенное использование пулов автоопределения - это уменьшение ярлыка памяти вашего приложения. См. Use Local Autorelease Pool Blocks to Reduce Peak Memory Footprint. Раньше это было used for thread programming, но теперь, когда у нас есть блок управления и отправки, нам больше не нужно писать традиционный многопоточный код, поэтому у нас не так много возможностей для использования отдельных пулов автоопределения в нашем многопоточном коде.

Смежные вопросы