Должен ли я всегда копировать или сохранять строку, возвращенную из функции - PullRequest
0 голосов
/ 05 марта 2012

Должен ли я вообще всегда сохранять или копировать строковое значение, возвращаемое функцией?

Рассмотрим следующие примеры:

- (NSString*) getString:
{
    return [[NSString alloc] autorelease];   
}

- (NSString*) getStringAlloc:   // Not sure if this convention is correct 
{
    return [NSString alloc];   
}  

...

В методе вызова

NSString* myString = [self getString];

Если я хочу продолжить и использовать myString в функции без ее освобождения, как мне справиться с этим. Также является именем второго метода, использующего правильные соглашения.

Если бы я знал, что возвращаемая строка автоматически высвобождается (из имени метода), и она не изменялась, то, вероятно, единственной причиной для сохранения или копирования будет то, что кто-то не изменит код в будущем. Если я не возражаю против изменения значения, то, опять же, мне, вероятно, не нужно сохранять или копировать.

Предположим, я не использую ARC.

Ответы [ 4 ]

3 голосов
/ 05 марта 2012

Нет! Область, в которой создается объект (в этом случае ваш метод "getString") также отвечает за его освобождение! Таким образом, первый подход является единственным действительным подходом.

Также getter-методы НЕ имеют префикса "get" по соглашению. Таким образом, метод должен называться - (NSString*) string вместо.

1 голос
/ 05 марта 2012

Прежде всего, если вы можете, вы должны использовать ARC.ARC отнимает большую часть управления памятью у разработчика.Я сказал больше всего, а не все, потому что если вы используете Core Graphics Framework, вы должны освободить объект самостоятельно.

Вам также следует рассмотреть возможность использования перегрузки автоматического освобождения для объекта NSString, как показано ниже:

NSString *someString = [NSString stringWithFormat:@"Hello World"];

Метод NSString stringWithFormat возвращает объект с автоматическим освобождением.

1 голос
/ 05 марта 2012

Если вы используете автоматическое освобождение, ваша строка не будет освобождена до тех пор, пока «внутренний вложенный пул автоматического выпуска не будет очищен».Если вы когда-либо создавали пул автоматического выпуска, вы, скорее всего, не читали бы это, поэтому давайте предположим, что у нас есть пулы автоматического выпуска системы.Он будет истощать их (то есть удалять ваши объекты, помеченные для автоматического выпуска) время от времени, когда ему больше нечего делать, но всегда в конце цикла событий.Это означает, что если вы присваиваете свой объект автоматического выпуска локальной переменной, вы можете быть уверены, что он будет сохранен во всей области действия вашей локальной переменной.Однако следует обратить внимание, когда вы присваиваете переменную autorelease члену класса, в этом случае ее можно удалить до следующего обращения к ней.Лучший способ избежать этого - использовать свойства типа retain.

1 голос
/ 05 марта 2012

Ваши соглашения - C ++, но если вы собираетесь использовать Какао, вы также можете быть Какао.Использование init, get, set в качестве префикса методов имеет особое значение в Objective C, поэтому знание их важно.

По сути, если вы создаете строку NSString, она либо будет уже сохранена (т.е. вы создаетеэто с помощью функции init) или autoreleases (т.е. вы создаете его с помощью метода, который не имеет init или копию в имени)Если он автоматически освобожден, вы можете использовать его в функции до конца функции, а затем он будет выпущен в будущем.Если он сохранен, вы должны освободить его.ARC справится с этим за вас, но вам все равно нужно знать основы управления памятью iOS, чтобы добиться успеха.Вам действительно нужно прочитать:

Руководство по управлению памятью Apple

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