2010-03-01 50 views
1

我一直在開發一個應用程序一段時間,現在我已經到了「儀器泄漏」部分。ivars以及如何正確實例化它們的值(iPhone)

我記得有一件事在我學習的幾個月前讓我對ivars感到困惑。我把所有的事情都放在了信心之上,並且遵循了Apple和其他人的做法。據我所知,由SDK生成的訪問器將負責內存管理。

但是,ivars如何初始化?

如果我在我的界面中有這樣的ivar;

@interface 
    { 
    NSArray *results; 
    } 

    @property(nonatomic, retain) NSArray *results; 
    @end 

@implementation 
@synthesize results; 

如果我在運行時嘗試這樣做:

[self setResults:allReadyInitializedArray]; 

它會崩潰,告訴我這個結果對象未初始化。如果我然而這樣做:

self.results = [[NSArray alloc] init]; //Im assigning this property memory, but hasn't the SDK already done that? 
[self setResults:allReadyInitializedArray]; 

它會工作,但它會顯然泄漏內存。

我的印象是,使用生成的 訪問器將釋放舊的值,然後設置新的,意思是 上面應該出來的舊值釋放和新的+1保留計數。

它是否具體與NSArray/NSMutableArray類型的伊娃有關,我不記得它與其他Ivars一直存在問題。

的問題一直特別突出的在我的XML解析器,在那裏我不斷地需要設置伊娃值,使用它,覆蓋此值,使用新值等

會有人幫我概述正確的方式「從」:@property() - > @synthesize - >使用伊娃 - > dealloc?

我已經閱讀了內存管理文檔,我試過在我的理解中尋找一些債務文檔,但似乎即使我每天都使用ivars,但我不明白後面發生了什麼場面。

+1

你在第一次做它的方式看起來正確。你能發佈你得到的錯誤消息的確切文本嗎? – kubi 2010-03-01 13:42:19

回答

0

我的理解是,

self.results = anArray; 

相同

[self setResults:anArray]; 

只是因爲結果是在這種情況下,一個屬性:要刪除泄漏一樣,你可以重寫代碼。

setResults的實現方式是由@property設置的(在這種情況下,它將保留新值)。所以這意味着aArray的保留計數爲1.設置self.results後,anArray的保留計數爲2.這就是爲什麼要釋放以前使用的anArray。這就是說,我不明白爲什麼setResults:當你設置它崩潰。 (也許它只是當你試圖使用self.results,而不是設置它崩潰) 我只是一個初學者我自己,如果有什麼問題我強烈鼓勵大家誰讀這個讓我知道什麼是錯的或正確的。仍然自己學習這個。

的方式,蘋果將做到這一點:

在.h文件

@property (nonatomic, retain) NSArray *results 

在.m文件

@synthesize results; 

- (id)init { 
    NSArray *anArray = [[NSArray alloc] init]; // retainCount = 1 
    self.results = anArray;      // retainCount = 2 
    [anArray release];       // retainCount = 1, only one "left" is in self.results 
} 

- (void)dealloc { 
    [results release]; 
} 
+0

嗨CrisB。我發現這寫的非常有用:http://www.iphonedevsdk.com/forum/iphone-sdk-tutorials/7295-getters-setters-properties-newbie.html 我做了一個正則表達式(self。* = \ [\ [。* alloc \])對於我的代碼中的每個實例,我沒有像您和Apple在上面描述的那樣執行操作。 (那裏有大約120個實例!) 然後,我再次遍歷所有代碼,並標記了如下操作的發生: 「arrayWithArray」並將它們標記爲// autorelease。 最後,我在@synthesize下移動了每個dealloc方法,以便更輕鬆地跟蹤一切。 所有這些都讓我對ivars有了更好的理解。謝謝 – RickiG 2010-03-02 14:59:04

2

所有ivars最初設置爲零,因此您需要在使用前將它們實例化。很難說爲什麼setResults可能會在沒有看到它的實現的情況下產生錯誤。

self.results = [[NSArray alloc] init]; 

在這裏您將使用的alloc方法,新的數組對象 - 其保留數等於1,你的setter方法保留您的數組一次,並讓你的第一個對象保留仍然是「未處理」,導致內存泄漏後。

self.results = [[[NSArray alloc] init] autorelease]; 
// or 
self.results = [NSArray arrayWith...]; // any NSArray's convenience method that returns autoreleased object. 
相關問題