Управление памятью, я должен сохранить? - PullRequest
2 голосов
/ 27 января 2012

Если я объявлю NSString в моем заголовочном файле следующим образом:

{
  NSString *testString; 
}
@property(nonatomic,retain) NSString *testString;

Затем синтезируйте строку в моем файле .m, как правильно ее инициализировать?Если я не напишу: self.testString = [[NSString alloc] init];

, то он никогда не инициализируется, но если я это сделаю, то не будет ли строка сохранена дважды?Или я должен инициализировать его другим способом, например:

self.testString = [NSString stringWithFormat:@"%@, sampleText];

Ответы [ 4 ]

2 голосов
/ 27 января 2012

Вы правы, прежний завладеет объектом.

Вместо этого используйте вторую форму.
Однако, если вам пришлось напрямую использовать ivar , вам нужно сохранить объект:

testString = [[NSString stringWithFormat:@"%@, sampleText] retain];
1 голос
/ 27 января 2012

Кажется, что вы объявляете переменную с именем testString в своем .h, а также создаете свойство, которое сохраняет.

Вы можете использовать это:

self.testString = [NSString string];

или вы можете использовать

testString = [[NSString alloc] init];

Определение переменной через свойство приведет к ее сохранению, поэтому вы объявили ее как (неатомарная, retain).Определение переменной через объявление не будет принимать во внимание эти аргументы.Вот краткое эмпирическое правило о сохранении.

Использование вашего кода в качестве основы:

self.testString = [[NSString alloc] init]; // Retain count = 2
self.testString = [NSString string];       // Retain count = 1
testString = [[NSString alloc] init];      // Retain count = 1
testString = [NSString string];            // Not retained at all.
1 голос
/ 27 января 2012

self.testString = [NSString stringWithFormat:@"%@, sampleText]; или self.testString = [NSString string]; правильно;self.testString = [[NSString alloc] init]; приведет к чрезмерному сохранению.

Рассмотрите возможность использования ARC (автоматический счет сохранения) для вашего проекта.С ARC компилятор заботится о сохранении счетчиков, поэтому вам не нужно, на самом деле это не разрешено.Существует рефакторинг, который преобразует текущий проект.

0 голосов
/ 27 января 2012

Прежде всего @property (nonatomic, copy) NSString *testString, чтобы избежать ошибок изменчивости. Второе - если вы хотите просто строку без утечек:

self.testString = [NSString string];
self.testString = [[[NSString alloc] init] autorelease];
self.testString = [NSString stringWithFormat:@"%@", text];

это все допустимые параметры.

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