2009-09-30 125 views
1

我只是好奇,是否需要在其他地方添加一個[名稱釋放]來匹配getter中的保留位置?餘額保留與釋放?

- (NSString *)name { 
    return [[name retain] autorelease]; 
} 

加里

回答

2

我不知道你的變量定義是如何在你的類中,但是規則是在你的getter中你應該返回引用計數不變的對象。如果要保留對它的引用,那麼調用者的責任是致電保留。

- (NSString*) name { 
    return name; 
} 

// caller 
NSString* name = object.name; 
[name retain]; // if necessary. If the string is used only in the context of a method you do not have to retain it. 

如果您使用的返回值作爲另一個類的字段,你應該這樣定義你的領域:

@property(retain, nonatomic) NSString* name; 

有了這樣的,當你賦予變量挽留將被調用。

+0

不要忘記相應的「@synthesize名稱;」 – nall 2009-09-30 16:13:47

2

沒有,這是好的。 autorelease會導致當前的自動釋放池被耗盡時釋放該值。

每個保留都必須與正確的釋放或自動釋放中的一個匹配。

但是,我相信保留和autorelease都不需要在這裏。通常你想使用autorelease慣用法,因爲你已經在方法中分配了一些東西。

+0

這就是我正在計算,保留只是讓NSString掛起。 – fuzzygoat 2009-09-30 16:09:54

+1

但是,這並不是這個方法的責任,它代表調用者。如果需要,此方法的調用者應該保留它。 – nall 2009-09-30 16:11:30

3

不,但你根本不需要這樣做,因爲你沒有分配任何東西。你可以簡單地返回名稱,這應該沒問題。是否有你需要添加這個保留/自動釋放的原因?

再多一點解釋,這裏發生的情況是,當您執行retain時,您的保留數量會增加1,如果由於autorelease而導致範圍存在,則會減少1。

+0

代碼很簡單,由Xcode爲實例變量生成:NSString * name; – fuzzygoat 2009-09-30 16:22:14

1

編號autorelease會將其平衡。然而,我不認爲retainautorelease是必要的。你可以簡單地使用return name

+0

這個想法是,如果有東西獲得屬性,然後設置它,它得到的對象不會死在它上面。 (我會使用'copy'而不是'retain',尤其是如果支持屬性的對象是可變的。) – 2009-09-30 23:56:43

0

我想我可能已經想通了:

如果該方法之外創建[myString的]那麼你可以放心使用......

return myString; 

如果在另一方面[myString的]是在方法內部創建,因此需要釋放並返回,然後使用。

myString = [[NSString alloc] initWithFormat: @"Send me home"]; 
return [myString autorelease]; 

這種方法設置[myString] autorelease,基本上創建對象,設置爲autorelease並返回。該對象最終將在池被銷燬時釋放。

+1

第一個示例中的[]括號是不必要的。返回'myObj'不會*自動釋放對象 - 它根本不會修改保留計數,這就是重點。如果你在一個方法內創建一個對象,你不應該在自動釋放它之前保留它。一般來說,對象要麼有一個+1保留計數(通過alloc/init,copy等創建),你需要自動釋放,或者+0保留計數,你不需要做任何事情。當你返回一個實例變量時,封閉對象通常被認爲擁有該對象,所以你只需返回它而不保留/自動釋放它。 – 2009-09-30 16:48:35

+0

根據你的意見,蘋果爲什麼通過「Place Accessor Def On Clipboard」從Xcode生成這個返回序列? – fuzzygoat 2009-09-30 17:07:03

+0

可能在需要時處理案件。我不會詳細查看它,但在這種情況下,您可以安全地將其刪除。 – 2009-09-30 17:12:45

1

正如其他人所說,你不需要保留或autorelease財產。由於'getter'方法的調用者沒有創建該對象,所以他們不擁有它,並且可以安全地假定他們不會修改它的保留計數。

但是,調用者可能會改變getter返回的變量的值,這會影響對象。因此,返回變量的副本可能會更好,特別是因爲它是NSString。 (對NSString的吸氣劑對象往往返回副本。)

- (NSString *)name { 
    return [[name copy] autorelease]; 
} 

在這種情況下,您所創建的變量的副本,讓你「擁有」它。通過在返回之前自動釋放它,確保它在活動者的作用域中能夠存活足夠長的時間,並且他們對'name'變量所做的任何更改都不會影響底層對象。

+0

的確,這是一個很好的觀點。 – fuzzygoat 2009-09-30 18:03:42

1

我只是好奇,是否需要在其他地方添加一個[name release]來匹配getter中的retain?

- (NSString *)name { 
    return [[name retain] autorelease]; 
} 

沒有,因爲你已經將其釋放。 autorelease只是意味着「稍後自己發送release」。

我想你應該檢討the memory-management rules

+0

再次閱讀它們,現在:)所以我可以認爲在這種情況下,保留與autorelease配對? – fuzzygoat 2009-10-01 08:36:10

+0

保留由autorelease引起的釋放進行平衡。所以是的,一個'autorelease'消息平衡一個'retain'或'copy'消息,就像立即釋放'消息一樣。 – 2009-10-01 08:50:28