我只是好奇,是否需要在其他地方添加一個[名稱釋放]來匹配getter中的保留位置?餘額保留與釋放?
- (NSString *)name {
return [[name retain] autorelease];
}
加里
我只是好奇,是否需要在其他地方添加一個[名稱釋放]來匹配getter中的保留位置?餘額保留與釋放?
- (NSString *)name {
return [[name retain] autorelease];
}
加里
我不知道你的變量定義是如何在你的類中,但是規則是在你的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;
有了這樣的,當你賦予變量挽留將被調用。
不,但你根本不需要這樣做,因爲你沒有分配任何東西。你可以簡單地返回名稱,這應該沒問題。是否有你需要添加這個保留/自動釋放的原因?
再多一點解釋,這裏發生的情況是,當您執行retain
時,您的保留數量會增加1,如果由於autorelease
而導致範圍存在,則會減少1。
代碼很簡單,由Xcode爲實例變量生成:NSString * name; – fuzzygoat 2009-09-30 16:22:14
編號autorelease
會將其平衡。然而,我不認爲retain
和autorelease
是必要的。你可以簡單地使用return name
。
這個想法是,如果有東西獲得屬性,然後設置它,它得到的對象不會死在它上面。 (我會使用'copy'而不是'retain',尤其是如果支持屬性的對象是可變的。) – 2009-09-30 23:56:43
我想我可能已經想通了:
如果該方法之外創建[myString的]那麼你可以放心使用......
return myString;
如果在另一方面[myString的]是在方法內部創建,因此需要釋放並返回,然後使用。
myString = [[NSString alloc] initWithFormat: @"Send me home"];
return [myString autorelease];
這種方法設置[myString] autorelease,基本上創建對象,設置爲autorelease並返回。該對象最終將在池被銷燬時釋放。
第一個示例中的[]括號是不必要的。返回'myObj'不會*自動釋放對象 - 它根本不會修改保留計數,這就是重點。如果你在一個方法內創建一個對象,你不應該在自動釋放它之前保留它。一般來說,對象要麼有一個+1保留計數(通過alloc/init,copy等創建),你需要自動釋放,或者+0保留計數,你不需要做任何事情。當你返回一個實例變量時,封閉對象通常被認爲擁有該對象,所以你只需返回它而不保留/自動釋放它。 – 2009-09-30 16:48:35
根據你的意見,蘋果爲什麼通過「Place Accessor Def On Clipboard」從Xcode生成這個返回序列? – fuzzygoat 2009-09-30 17:07:03
可能在需要時處理案件。我不會詳細查看它,但在這種情況下,您可以安全地將其刪除。 – 2009-09-30 17:12:45
正如其他人所說,你不需要保留或autorelease財產。由於'getter'方法的調用者沒有創建該對象,所以他們不擁有它,並且可以安全地假定他們不會修改它的保留計數。
但是,調用者可能會改變getter返回的變量的值,這會影響對象。因此,返回變量的副本可能會更好,特別是因爲它是NSString。 (對NSString的吸氣劑對象往往返回副本。)
- (NSString *)name {
return [[name copy] autorelease];
}
在這種情況下,您所創建的變量的副本,讓你「擁有」它。通過在返回之前自動釋放它,確保它在活動者的作用域中能夠存活足夠長的時間,並且他們對'name'變量所做的任何更改都不會影響底層對象。
的確,這是一個很好的觀點。 – fuzzygoat 2009-09-30 18:03:42
我只是好奇,是否需要在其他地方添加一個[name release]來匹配getter中的retain?
- (NSString *)name { return [[name retain] autorelease]; }
沒有,因爲你已經將其釋放。 autorelease
只是意味着「稍後自己發送release
」。
我想你應該檢討the memory-management rules。
再次閱讀它們,現在:)所以我可以認爲在這種情況下,保留與autorelease配對? – fuzzygoat 2009-10-01 08:36:10
保留由autorelease引起的釋放進行平衡。所以是的,一個'autorelease'消息平衡一個'retain'或'copy'消息,就像立即釋放'消息一樣。 – 2009-10-01 08:50:28
不要忘記相應的「@synthesize名稱;」 – nall 2009-09-30 16:13:47