2012-06-18 5 views
0

Я читал документ о ARC и наткнулся на часть, которая меня смутила. Пожалуйста, кто-нибудь может мне помочь. У меня есть два вопроса: 1.I знаю объект выпуска ARC, когда никакая переменная не указывает на него. Теперь предположим, что у меня есть какой-то метод: (NSString *) returnString, чей тип возврата - NSSTring, и что произойдет с переменной, которая объявляется в методе returnString? Я знаю, что получающая переменная получит release, когда она выходит из области действия метода, где вызывается returnString, но что произойдет с переменной, которая находится внутри returnString.Как освобождается память при использовании ARC?

-(NSSTring *)returnString 
{ 
    NSString *str = //Some value; 

    return str;//What will happen to this. 
} 

и Другой метод:

-(void)useString 
{ 
    NSString *str1 = [self returnString]; //It will get release when this method gets over. 
} 

2.Что будет, если returnString в какой-то библиотеки третьей стороны, которая не скомпилированные с ARC?

ответ

0

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

Для вашего второго вопроса вы можете пометить библиотеки как не используемые ARC, чтобы сохранить сохранение/освобождение вручную. Для этого см. Этот вопрос: ios5 ARC what is the compiler flag to exclude a file from ARC?

+0

Спасибо за ваш ответ. Я получил первый ответ. Но для второго вопроса, который вы хотите сказать, мне нужно авторейтировать строку вручную во втором случае? –

+0

Если файл отмечен как «-fno-objc-arc», вам все равно потребуется ручное сохранение/освобождение/автозапуск. – kevboh

2

ARC просто вставляет вызовы методов [... retain] и [... release] во время компиляции. В вашем случае он видит, что «str» является локальной переменной и добавляет вызов метода автозагрузки сразу после объявления. Так что, действительно, память освобождается таким же образом, но вам не о чем беспокоиться, ARC делает это за вас.

+0

Компилятор выполняет и оптимизирует код после добавления '-retain',' -release' и '-autorelease', поэтому много добавленного кода может быть снова удаляется, даже через вызовы. В пуле автообновлений будет меньше объектов. – hypercrypt

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