Об управлении памятью в iPhone - PullRequest
0 голосов
/ 31 августа 2011

Пожалуйста, уточните следующее.

Все это знают; если мы используем alloc, retain, new и etc..., мы должны выпустить его. Для остальных вещей мы должны использовать autorelease. Мое сомнение;

-(NSArray*)getArray{
    NSArray *array = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", nil];
    return [array autorelease];
}
NSArray *arr = [self getArray];
---
---

Что мы должны сделать arr?

EDIT:

NSString *str = [NSString stringWithFormat:@"Welcome..."];

Если мы используем вышеприведенное утверждение, нам следует позвонить autorelease. Но я хочу знать, что происходит в методе stringWithFormat:. Как это возвращается NSString.

Спасибо.

Ответы [ 4 ]

1 голос
/ 31 августа 2011

Вам не нужно ничего делать с arr, поскольку вы явно не указали alloc, copy, new или retain в его текущей области видимости.Он уже добавлен в пул автоматического выпуска, поэтому он будет автоматически очищен, как только вы закончите с ним.

EDIT : В вашем отредактированном вопросе [NSString stringWithFormat:] возвращает автоматически освобожденную строку,По сути, он делает то же самое, что и в вашем методе getArray.Он создает объект NSString (или связанный с ним) и автоматически выпускает его перед возвращением.

1 голос
/ 31 августа 2011

Если вы планируете вернуть массив, используйте вместо этого [NSArray arrayWithObjects: @ "1", @ "2" и т. Д., Nil].

Затем вам просто нужно запомнитьсохраните его, если вы хотите удерживать его дольше, тогда пул автоматического выпуска удержит его.

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

0 голосов
/ 31 августа 2011

Ваш метод getArray возвращает NSArray, который _will_be_ освобождается, когда стек полностью разматывается.

В методе, где вы вызываете свой метод getArray, безопасно использовать NSArray, но если вы хотите сохранить его и использовать его после возврата из текущего метода, вам нужно будет сохранить NSArray с[arr retain].

Ответ на ваш новый вопрос

Методы класса, например [NSString stringWithFormat:] или как [NSURL URLWithString:], возвращают объекты, которые были автоматически освобождены,Это соглашение, стандартная практика в UIKit и платформах Apple.

0 голосов
/ 31 августа 2011

Вы должны оставить:

[[self getArray] retain];

Или вернуть неавторизованный объект в getArray.

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