2

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];
}
4

2 に答える 2

4

Cocoa の関数は、Cocoa の他のすべてのものと同じメモリ管理規則に従います。最初の例はまったく問題ありません。

于 2009-01-11T07:31:32.203 に答える
2

Objective-C で問題ないだけでなく、明確に定義された所有権のセマンティクスがある限り、C では本質的に問題ではありません。

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

void bar()
{
    CFStringRef str = foo();
    CFRelease(str);
    // Nothing leaked.
}
于 2009-01-11T16:28:01.387 に答える