2013-05-01 3 views
0

Я использую ARC, и я знаю, что autoreleasepool отправляет релиз всем элементам внутри него. Рассмотрим следующий пример.что делает @autoreleasepool делать?

-(NSString*)someMethod{ 

    NSString *[email protected]"sample text inside string 1"; // string1 add to main autorelease pool 
    NSString *string2=[[NSString alloc] init];  // string2 retain count is 1 

    [email protected]"sample text inside string 2";   // just assigning 

    return string1; 

} 

-(void)viewDidLoad{ 

    NSString *returnedString=[self someMethod]; 

} 

1. так что мой вопрос, как я полностью освободить string2 в SomeMethod?

2. Как полностью освободить строку1 из метода viewDidLoad полностью?

Примечание: Я использую ARC

, если я использую @autoreleasepool в SomeMethod, то я думаю, что он будет уничтожать как string1 и string2. не так ли?

А что будет эффект от использования @autoreleasepool в SomeMethod

-(NSString*)someMethod{ 

    @autoreleasepool{ 

    NSString *[email protected]"sample text inside string 1"; // string1 add to main autorelease pool 
    NSString *string2=[[NSString alloc] init];  // string2 retain count is 1 

    [email protected]"sample text inside string 2";   // just assigning 

    } 
    return string1; 

} 
+1

Стоит отметить, что во всех сотнях вопросов, подобных этому, никакой полезный пример никогда не может быть выполнен с использованием литерала. Они являются константами времени компиляции и, как таковые, не обрабатываются стандартным управлением памятью. – jrturton

+0

Возможный дубликат [Objective-C: Почему автореферат (@autoreleasepool) по-прежнему необходим с ARC?] (Http://stackoverflow.com/questions/9086913/objective-c-why-is-autorelease-autoreleasepool-still-needed -with-arc) – Igor

ответ

2

Прежде всего,

NSString *string2=[[NSString alloc] init]; 
[email protected]"sample text inside string 2"; 

строка2 не является сам объект. Это указатель на объект. Итак, здесь вы создаете объект, получаете указатель на него, а затем сразу же заменяете его указателем на другую строку. Если вы не использовали ARC, вы могли бы утечка памяти здесь. Взгляните на ответ @Anoop Vaidya, чтобы получить более подробную информацию об этом.

Что касается ваших вопросов: при использовании ARC компилятор автоматически отслеживает объекты и освобождает их, когда они больше не используются. Таким образом, вы не должны выпускать его вручную. Вы можете назначить указатель на ноль, но как только я помню, это не обязательно.

Код из вашего второго примера не будет компилироваться, поскольку строка string1 объявлена ​​внутри области автоопределения. И на самом деле это @autorelease здесь не имеет никакого значения, поскольку вы не создаете в нем объекты с автореализацией.

This question содержит более подробную информацию об использовании пула авторешетки с ARC. И официальная документация Apple, вероятно, является лучшей из всех, что я когда-либо видел, поэтому, пожалуйста, не забудьте взглянуть на their Advanced memory management programming guide. Это не слишком долго, и это объясняет все подробно :)

+1

Значение 'string2' в этом примере не равно 1. – bbum

+0

Я скопировал этот код вопроса и не изменил комментарий. Но почему это не так? Если мы используем [[NSString alloc] init] без ARC, мы получаем строку с saveCount == 1. Изменяет ли ARC это поведение? Я говорю о первой строке кода, так как комментарий находится в первой строке. На данный момент я удалю комментарий из кода. В любом случае спасибо за помощь в поиске истины :) – FreeNickname

+1

Это не имеет никакого отношения к ARC. Это полностью внутренняя деталь реализации и указывает на то, насколько бесполезным является 'keepCount'. '[[NSString alloc] init]' возвращает одноэлементный номер, удержание которого 'UINT_MAX'. Вы можете ... и должны ... считать счетчик сохранения '+ 1' (дельта +1), и вам нужно сбалансировать это с помощью' release', но значение абсолютного значения сохранения бесполезно. – bbum

0
NSString *string2=[[NSString alloc] init];  // string2 retain count is 1 
[email protected]"sample text inside string 2"; 

плохой способ делать.

Вместо сделать этот путь

NSString *string2=[[NSString alloc] initWithString:@"sample text inside string 2"]; 

Или даже

NSString *[email protected]"sample text inside string 2"; 

string1 находится в режиме autorelease г, вы не должны освободить его.

Как вы используете ARC(Automatic Reference Counting). Вы никогда не отпускаете объект. Компилятор позаботится об этом.

+0

как насчет string1 как я могу это освободить? –

+0

@MuhammadNasir: Я написал: вам не нужно его выпускать, то есть в режиме автоопределения. Он будет выпущен в конце пула авторефератов. –

+0

@MuhammadNasir: какая строка? –

0

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

+0

Я знаю, что это будет позаботиться, когда бассейн будет истощен. Мой вопрос заключается в том, как я могу немедленно его отпустить. например, я хочу выпустить строку2 в том же методе. так как я могу это сделать –

2

Вы не можете освободить объект, если вы используете ARC. Он обрабатывается самим complier, когда вы используете ARC.

Таким образом, даже строка будет выпущена точно так же.

+0

Что делать, если я использую string2 = nil; в someMethod, а затем в viewDidload set receivedString = nil; это будет работать? –

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