2012-04-10 76 views
1

我確認我的應用程序,我得到了很多這樣的警告的:對象與+0保留計數返回給呼叫方,其中一個+1(擁有)保留計數預計

對象與+ 0保留計數返回給呼叫方,其中一個+1(擁有)保留計數預計

這是那些產生警告的方法之一的例子(警告後返回線)

+ (vehicleInfo*) newWithNode: (CXMLNode*) node 
{ 
    if(node == nil) { return nil; } 
    return (vehicleInfo*)[[[vehicleInfo alloc] initWithNode: node] autorelease]; 
} 

是這是我應該擔心的事情? 我該如何解決它?

由於提前, 塞繆爾

回答

3

你得到了警告,因爲你違反了,你變成了一臺帶new命名的方法創建的對象的所有者的合同。任何代碼調用+newWithNode預計將是返回值的所有者,並且應該稍後調用-release來釋放它。

有關詳細信息,請參閱Objective-C Memory Management Policy

+0

按照你的鏈接,導說: – 2012-04-12 21:26:03

-1

按照您鏈接,導說:

使用自動釋放給發送延遲釋放

您使用自動釋放,當你需要從方法返回一個對象時發送延遲釋放消息,通常。例如,您可以執行如下所示的fullName方法:

- (NSString *)fullName { 
    NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", 
             self.firstName, self.lastName] autorelease]; 
    return string; 
} 

您擁有由alloc返回的字符串。要遵守內存管理規則,必須先放棄字符串的所有權,然後再丟失對該字符串的引用。但是,如果使用釋放,字符串將在返回之前解除分配(並且該方法將返回無效的對象)。使用autorelease,表示您想放棄所有權,但是您允許方法的調用方在釋放之前使用返回的字符串。

所以,儘管警告,似乎我做的是正確的東西,不是嗎?

+0

這不是一個答案,請不要等回答這,編輯您的問題或提出新問題。在任何情況下,不,你沒有做正確的事情:你的方法名稱'newWithNode:'意味着調用者將擁有返回的對象,但是因爲你正在自動釋放返回值,所以調用者不會成爲所有者,所以你違反了慣例。 – 2012-04-15 01:26:01

相關問題