2009-01-11 62 views
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]; 
} 
+0

顺便说一句,你的第二个例子将失败。您不能在函数内重新分配指针,因为指针本身是按值复制的。如果你想让你的第二个例子工作,你必须使用NSString ** modifyMe作为参数... – 2009-01-11 13:42:35

+0

哈,谢谢贾森!固定。 – dreeves 2009-01-11 19:18:18

+0

我通常将第二个示例中的模式称为“输出参数”。不知道是否有其他人这样做,但这就是我所说的。 – ipmcc 2013-02-09 12:41:33

回答

4

Cocoa中的函数遵循与Cocoa中所有其他内容管理规则相同的内存管理规则。你的第一个例子非常好。

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. 
}
相关问题