Obj-C: передача указателей на инициализированные классы в других классах - PullRequest
0 голосов
/ 08 июня 2010

Я инициализировал класс в моем синглтоне под названием DataModel.Теперь из моего UIViewController, когда я нажимаю кнопку, у меня есть метод, который пытается получить доступ к этому классу, чтобы я мог добавить объект в один из его словарей.Мой метод get / set возвращает указатель на класс из моего синглтона, но когда я возвращаюсь в свой UIViewController, передаваемый обратно класс не отвечает на методы.Как будто его просто нет.Я думаю, что это как-то связано с различием в наведении указателей на занятия или что-то в этом роде.Я даже пытался использовать метод копирования, чтобы отбросить копию, но безуспешно.

UIViewController:

ApplicationSingleton *applicationSingleton = [[ApplicationSingleton alloc] init];

DataModel *dataModel = [applicationSingleton getDataModel];

[dataModel retrieveDataCategory:dataCategory];

Singleton:

ApplicationSingleton *m_instance;
DataModel *m_dataModel;

- (id) init {
    NSLog(@"ApplicationSingleton.m initialized.");
    self = [super init];
    if(self != nil) {
        if(m_instance != nil) {
            return m_instance;
            }
        NSLog(@"Initializing the application singleton.");
        m_instance = self;
        m_dataModel = [[DataModel alloc] init];   
        }
    NSLog(@"ApplicationSingleton init method returning.");
    return m_instance;
    }

-(DataModel *)getDataModel {
    DataModel *dataModel_COPY = [m_dataModel copy];
    return dataModel_COPY;
    }

Для метода getDataModelЯ также попробовал это:

-(DataModel *)getDataModel {
    return m_dataModel;
    }

В моем методе DataModel retrieveDataCategory я не мог заставить что-либо работать.Я даже пытался вставить туда NSLog, но он никогда не попадал на консоль.

Есть идеи?

1 Ответ

1 голос
/ 08 июня 2010

Скорее всего, вы отправляете сообщения, которые игнорируются, например, они отправляются на объекты, которые не существуют / не являются тем, который вы ищете, и по какой-то причине не сбои. Это происходит в случае сообщения ноль или, возможно, других незаконных значений. Хотя вы, похоже, ожидаете, что переменные m_ будут инициализированы в 0, это не очень хорошая форма, и, кроме того, вы не следуете очень типичному шаблону objc для ваших синглетонов - m_dataModel должен быть иваром m_instance, а m_instance, вероятно, должен быть объявлен статическим, так как вы , вероятно, не хотите, чтобы к нему обращались напрямую из других файлов. Кроме того, наиболее вероятным источником вашей ошибки является метод -init, который никогда не следует вызывать для синглтона - вместо этого сделайте что-то вроде этого:

+ (ApplicationSingleton *)sharedInstance {
     static ApplicationSingleton *instance = nil;
     if(!instance) {
          instance = [[self alloc] init]; //or whatever custom initializer you would like, furthermore some people just put the initialization code here and leave -init empty
     }
     return instance;
}

код, который у вас есть, теперь утекает, потому что вы выделяете объект (self) и не освобождаете его до возвращения потенциально другого экземпляра (общего, если он уже существует), так что вновь выделенный обычно теряется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...