2011-03-09 21 views
0

我有一個字典已分配,並準備好進入我的程序的appDelegate。爲什麼我的NSmutableDictionary被轉換成NSCFString?

//appdel.m 
    NSMutableDictionary *dict; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {  

    // Overide point for customization after application launch. 

    dict = [[NSMutableDictionary alloc]init]; 


    dict = HBLoadDictionary(@"/dict.plist"); 

    // Add the tab bar controller's view to the window and display. 
    [self.window addSubview:tabBarController.view]; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 

所以我想讓這個字典存在於其他文件中,所以我把它作爲一個外部的其他文件進行編輯和讀取。

//viewcontroller.m 
    extern NSMutableDictionary *dict; 

和稍後我決定設置一個鍵的對象。事件只是一個EKevent。

NSString* str = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier]; 
NSString *eID = [[NSString alloc]init]; 
eID = [data valueForKey:@"id"]; 
[dict setObject:str forKey:eID]; 

當我做出一個函數調用,我會得到這個

- [NSCFString的setObject:forKey:]:無法識別的選擇發送到實例

在一個點上我甚至有一個UIImage而不是一個NSCFString,這導致我相信內存是一個問題,我沒有處理它的權利。爲什麼它甚至改變那種類型?導致其導致函數調用混亂...

回答

2

問題是您分配的NSMutableDictionary立即由HBLoadDictionary替換爲返回值。我會假設HBLoadDictionary返回一個autoreleased對象,你不保留在任何地方。在加載字典之後不久,它將被釋放,所以dict指向釋放的內存。此外,您分配的第一個NSMutableDictionary被泄漏。

您可以通過替換

dict = [[NSMutableDictionary alloc]init]; 
dict = HBLoadDictionary(@"/dict.plist"); 

dict = [HBLoadDictionary(@"/dict.plist") retain]; 

作爲一個側面說明解決這個問題,這是不好的做法在Objective-C的方法來初始化一個全局變量。儘管您可能不會有多個應用程序委託,並且其應用程序didFinishLaunchingWithOptions:方法不會被多次調用,但這可能會在其他情況下導致內存泄漏。你最好使用返回靜態變量的類方法。

+0

你的權利我不認爲有可能在保留中包裝c方法。至於泄漏去,我有一個相當的看法,但我補丁。我沒有想過要有一個靜態變量,那會是我的單身權利嗎? – Ohmnastrum

+0

對,靜態變量是你的單身人士。你可以使用像[MyAppDelegate dict]這樣的東西來訪問它,這是一個應該總是返回同一個對象的類方法。您將在初始化爲nil的實現中有一個靜態的NSMutableDictionary變量。聲明之後,檢查變量是否爲零,如果是,則使用上面答案中的行進行初始化。 – lazycs

相關問題