簡體   English   中英

Objective-C 2.0; 分配財產; 內存泄漏?

[英]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.

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