Возврат указателя на память, выделенную внутри функции - PullRequest
2 голосов
/ 11 января 2009

В C что-то вроде следующего будет катастрофой (то есть утечкой памяти), потому что вы возвращаете указатель на память, которую вы никогда не сможете освободить:

NSString* foo()
{
  return [NSString stringWithFormat:@"%i+%i=%i", 2, 2, 2+2];
}

Это на самом деле совершенно нормально в Objective-C, поскольку память, на которую указывает возвращаемый указатель, будет автоматически освобождена? Даже если все в порядке, это по какой-то причине осуждается? Любая причина, чтобы предпочесть стиль C, как показано ниже?

void foo(NSString ** modifyMe)
{
  *modifyMe = [NSString stringWithFormat:@"%i+%i=%i", 2, 2, 2+2];
}

Ответы [ 2 ]

4 голосов
/ 11 января 2009

Функции в Какао подчиняются тем же правилам управления памятью, что и все остальное в Какао. Ваш первый пример прекрасно.

2 голосов
/ 11 января 2009

Мало того, что это нормально в Objective-C, но это не является проблемой по сути в C, если у вас есть четко определенная семантика владения.

CFStringRef foo()
{
    return CFStringCreateWithFormat(NULL, CFSTR("%i+%i=%"), 2, 2, 2+2);
}

void bar()
{
    CFStringRef str = foo();
    CFRelease(str);
    // Nothing leaked.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...