NSString stringByAppendingString проблема с памятью - PullRequest
0 голосов
/ 05 марта 2010

На объективе с iPhone:

Я хочу добавить строку, но могу ли я использовать авто-релиз? Это правильно?

NSString *str1 = [[NSString alloc] initWithString:@"STR1"];
NSString *str2 = [[NSString alloc] initWithString:@"STR2"];

NSString *s = [[str1 autorelease] stringByAppendingString:[str2 autorelease]];

удалит ли это память * str1 и * str2?

И, например, если у меня есть метод:

+(void) doSomething
{
    NSString *str1 = [[NSString alloc] initWithString:@"STR1"];
    NSString *str2 = [[NSString alloc] initWithString:@"STR2"];

    NSString *s = [[str1 autorelease] stringByAppendingString:[str2 autorelease]];
    [[NSClassFromString(s) alloc] init];
}

Должен ли я освободить указатель * s

1 Ответ

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

Общее правило заключается в том, что если вы звоните alloc, вы должны позвонить release на этот ресурс.

Таким образом, для вашего первого примера str1 и str2 будут удалены из памяти, однако вы не соблюдаете соглашение для своих авто-релизов. Вместо этого добавьте авто-релиз в строку выделения:

NSString *str1 = [[[NSString alloc] initWithString:@"STR1"] autorelease];
NSString *str2 = [[[NSString alloc] initWithString:@"STR2"] autorelease];

Во втором примере, поскольку вы не вызываете alloc для метода stringByAppendingString, вам не нужно выпускать s.

Прочтите Руководство по управлению памятью iPhone . Это стоит предварительных инвестиций, так что вам не придется решать эти проблемы в будущем. После этого прочитайте сообщение в блоге Akosma Software.

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