2011-02-26 56 views
2

我遇到了應用程序中的內存管理問題。我有一個NSDictionary實例變量,我將其設置爲等於在方法中創建的另一個NSDictionary。這一切都正常工作,我的應用程序表現得像我想要的,但我無法應用正確的內存管理。Objective-C內存問題

如果我釋放本地字典,它最終會導致崩潰,因爲方法被重複調用,因爲保存在實例變量中的數據也被丟棄。這裏的代碼:

NSBundle *bundle = [NSBundle mainBundle]; 
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"]; 

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
self.dictAllValues = dictionary; 
[dictionary release]; 

回答

2

使用

@property(retain) NSDictionary *dictAllValues; 

你的方法

-(void) myMethod 
{ 
NSBundle *bundle = [NSBundle mainBundle]; 
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"]; 

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 
self.dictAllValues = dictionary; 
[dictionary release]; 
} 

和dealloc方法釋放

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

P.S.如果你正在修改字典...使用NSMutableDictionary而不是NSDictionary – 2011-02-26 18:49:29

1

apple memory management guide

作爲基本規則的必然結果,如果您需要將接收的對象作爲屬性存儲在實例變量中,則必須保留或複製它。

因此,在這種情況下,將[dictionary release];放在dealloc方法中(或者您可能用於清理的任何其他方法)應該可以正常工作。

我假設你的dictAllValues屬性使用簡單賦值,讓我知道如果不是這樣的話。

+0

感謝您的快速回復,解釋了很多創建dictAllValues,但不會字典在dealloc方法中超出範圍?是的,它使用簡單的分配。是否必須在dealloc方法中釋放dictAllValues? – 2011-02-26 18:05:21

+0

@Justin你是什麼意思,「超出範圍」?通過'alloc'創建一個對象,你成爲了一個對象的所有者,因此當你完成後需要調用'release'或'autorelease'。現在你在當前方法中發出信號「我不再需要這個對象」,因此對象被丟棄(與它的內容一起)。如果你打算稍後使用它(你似乎這樣做了,因爲你已經創建了一個本地屬性),現在就保存它。 – 2011-02-26 18:09:29

+0

是啊,我知道,這就是我想要做的,但字典是在類方法中聲明爲局部變量;如果我在 - (void)dealloc中引用它,它不會知道我在說什麼,你是不是想把[dictAllValues發佈]放在dealloc方法中?我已經在那裏了,所以我認爲這樣會很好嗎? – 2011-02-26 18:12:56

1

你如何申報dictAllValues?通常情況下,這將是:

@property(retain) NSDictionary *dictAllValues; 

如果是這樣,那麼在你的代碼的release是正確的,你的問題不在於此。發佈崩潰的回溯,使用構建和分析並修復任何問題,並嘗試開啓殭屍檢測。