我有一個模型類,保持跟蹤記錄由多個視圖構建。它有一個NSMutableDictionary,它有我最終寫入數據庫的字段和值。它被保存到plist並在需要時裝回。我以爲我記錄了我的記憶,但是當我嘗試發佈字典時,它會拋出EXC_BAD_ACCESS。這是我的接口:Objective C NSMutableDictionary內存管理
#import <Foundation/Foundation.h>
@interface CurrentEntryModel : NSObject {
NSMutableDictionary *currentEntry;
}
@property (nonatomic, retain) NSMutableDictionary *currentEntry;
- (void) setValue: (NSString *)value;
- (NSString *) getValue;
@end
我的理解是currentEntry應該保留,我將不得不在dealloc期間釋放它。
這裏是我的實現(這是不是整個類只是相關部分):
#import "CurrentEntryModel.h"
@implementation CurrentEntryModel
@synthesize currentEntry;
-(id) init {
if (self = [super init])
{
//check for file
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *file;
file = @"location.plist";
if ([fileManager fileExistsAtPath:file]){
NSLog(@"file exists");
currentEntry = [[NSMutableDictionary alloc] initWithContentsOfFile:file];
}else {
NSLog(@"file doesn't exist");
currentEntry = [[NSMutableDictionary alloc ] initWithCapacity:1];
NSDate *testDate = [NSDate date];
[currentEntry setObject:testDate forKey:@"created"];
[currentEntry writeToFile:file atomically:YES];
}
}
return self;
}
- (void) setValue: (NSString *)value {
[currentEntry setObject:value forKey:@"location"];
}
- (NSString *) getValue {
return [currentEntry objectForKey:@"location"];
}
- (void) dealloc{
[currentEntry release];
[super dealloc];
}
@end
如果我初始化這個類會自動創建字典,如果我叫組的一個或得到它看起來像字典保留,因爲它會正確釋放。如果該類剛剛初始化,然後沒有方法被調用,它將拋出EXC_BAD_ACCESS錯誤。如果我沒有錯誤,當文件不存在時,我不正確地初始化字典,因爲該方法以字典而不是初始化開始。雖然每次運行該文件時都會使用該文件,但我認爲這將保留該變量。
我不正確初始化字典嗎?
編輯 - 更改便利方法上的代碼以反映正確的方式。每個人都注意到Squeegy必須說的話。
我欣賞關於類方法的信息,但是我在我的問題中已經說過,這不是錯誤的來源 - 「雖然每次運行此文件時都會使用文件找到的邏輯,而我認爲這將保留變量'。有沒有人有任何想法? – Joshua 2011-04-07 01:51:01