2009-01-11 125 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. 
}