Почему мой NSmutableDictionary превращается в NSCFString? - PullRequest
0 голосов
/ 09 марта 2011

У меня есть словарь, выделенный и готовый к использованию в приложении Delegate моей программы.

//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, что заставило меня поверить, что память - это проблема, и я неправильно ее решаю.Почему даже такие типы меняются?вызвать вызывающие его вызовы функций ...

1 Ответ

2 голосов
/ 10 марта 2011

Проблема в том, что выделенный вами NSMutableDictionary немедленно заменяется возвращаемым значением из HBLoadDictionary. Я бы предположил, что HBLoadDictionary возвращает автоматически выпущенный объект, который вы нигде не сохраняете. Вскоре после загрузки словаря он освобождается, поэтому dict указывает на свободную память. Кроме того, первый выделенный вами NSMutableDictionary просочился.

Вы можете исправить это, заменив

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

с

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

В качестве примечания: инициализировать глобальную переменную в методе target-c является плохой практикой. Хотя у вас, вероятно, не будет более одного делегата приложения и его приложения: didFinishLaunchingWithOptions: метод не будет вызываться более одного раза, это может вызвать утечку памяти в других ситуациях. Вам лучше иметь метод класса, который возвращает статическую переменную.

...