[英]Objective-C 2.0; Assigning a Property; Leaking Memory?
我仍在學習Objective-C內存管理。 我正在嘗試在要構建的示例程序中實現幾個簡單的類。
例如,說我有以下類定義:
#import <UIKit/UIKit.h>
@interface customViewController : UIViewController
{
customObject *myCustomObject;
}
@property (retain) customObject *myCustomObject;
- (void)replaceCustomObject:(customObject *)newObject;
@end
對於屬性,我使用標准的synthesize關鍵字...
@synthesize myCustomObject;
然后,請假設在customViewController實例中,myCustomObject已經設置了有效值,並且正在使用中。 然后將方法replaceCustomObject定義為:
- (void)replaceCustomObject:(customObject *)newObject
{
//Does this cause a memory leak because I just assign over
//the existing property?
self.myCustomObject = newObject;
}
正如評論所問, 這是否泄漏內存? 還是這是用新對象替換先前對象的有效方法?
謝謝,
坦率
正如其他人提到的那樣,您的代碼是完全有效的,並且在分配給屬性時不會泄漏內存。
如果您忘記實現適當的dealloc
方法,則銷毀customViewController
時,最后分配的對象將泄漏。 正確的dealloc
實現如下所示:
- (void)dealloc
{
self.myCustomObject = nil;
[super dealloc];
}
這是完全有效的,並且不會泄漏內存。 綜合訪問器可以正確管理保留計數。
(順便說一句,您不需要replaceCustomObject:方法;由於默認情況下您的屬性是可讀寫的,因此您有一個自動生成的setCustomObject:方法,您的類的客戶端可以使用該方法,並且遵循常規的Cocoa命名約定。)
根據這個 ,如果你在你的聲明中使用(保留),合成的方法將首先釋放舊的值,然后保留新的:
if (property != newValue) {
[property release];
property = [newValue retain];
}
屬性訪問器語法
self.x = y;
與顯式調用setter方法具有相同的效果:
[self setX:y];
訪問器方法將執行已編寫的所有操作。 在您的情況下,對於已@synthesize的@property(retain)屬性,訪問器將釋放舊對象並保留新對象。
因此,無論是顯式還是通過“。”調用設置器。 語法,將做正確的事情-包括正確的內存管理。
簡而言之:不,這不會泄漏內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.