簡體   English   中英

在getter方法中保留和自動釋放

[英]retain and autorelease in a getter method

我正在學習內存管理,但我真的不明白為什么我應該像這樣實現我的屬性getter:

-(Weapon*)myWeapon
{
    [myWeapon retain];
    [myWeapon autorelease];
    return myWeapon;
}

我理解我的寫作,但我無法想象它為什么重要? 你能解釋一下我為什么要這樣做嗎?

這來自內存管理編程指南:

技術1在技術1中,getter返回的值在調用范圍內自動釋放:

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

- (void) setTitle: (NSString*) newTitle {
    if (title != newTitle) {
        [title release];
        title = [newTitle retain]; // Or copy, depending on your needs.
    }
}

因為從get訪問器返回的對象是在當前作用域中自動釋放的,所以如果更改了屬性值,它仍然有效。 這使得訪問器更加健壯,但代價是額外的開銷。 如果您希望頻繁調用getter方法,則保留和自動釋放對象的額外成本可能不值得花費性能。

技術2與技術1類似,技術2也使用自動釋放技術,但這次在setter方法中這樣做:

- (NSString*) title {
    return title;
}

- (void) setTitle: (NSString*) newTitle {
    [title autorelease];
    title = [newTitle retain]; // Or copy, depending on your needs.
}

在比使用setter更頻繁地調用getter的情況下,技術2的性能明顯優於技術1。

技術3技術3完全避免使用自動釋放:

- (NSString*) title {
    return title;
}

- (void) setTitle: (NSString*) newTitle {
    if (newTitle != title) {
        [title release];
        title = [newTitle retain]; // Or copy, depending on your needs.
    }
}

技術3使用的方法適用於經常調用的getter和setter方法。 它也適用於不希望延長其值的生命周期的對象,例如集合類。 它的缺點是可能會立即釋放舊值(如果沒有其他所有者),如果另一個對象維護對它的非擁有引用,則會導致問題。 例如:

NSString *oldTitle = [anObject title];
[anObject setTitle:@"New Title"];
NSLog(@"Old title was: %@", oldTitle);

如果anObject是唯一擁有原始標題字符串的對象,則在設置新標題后將取消分配該字符串。 然后log語句會導致崩潰,因為oldTitle是一個釋放的對象。

編輯:基本上保留然后自動釋放的目的是確保如果在調用范圍有機會保留它之前更改屬性值,則不會釋放對象。 除非你有異步代碼,否則這通常不是問題。 在大多數情況下- (Weapon *)myWeapon { return myWeapon; } - (Weapon *)myWeapon { return myWeapon; }就好了(加上它的速度更快)。

正如ACBurk所說,但這里有一個很好的描述:

http://vgable.com/blog/2009/03/31/how-to-write-cocoa-object-getters/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM