Как правильно получить ссылку на другой класс? - PullRequest
0 голосов
/ 01 июня 2009

У меня есть некоторый класс, инициализированный в Appdelegate, но когда я получаю эту форму экземпляра класса Appdelegate в другом классе, он имеет "свежее" состояние.

У меня есть следующее в AppDelegate:

Интерфейс:

@property (nonatomic, retain) DataController *dataController;

Реализация:

@synthesize dataController;
- (id)init {
    if (self = [super init]) {
        DataController *controller = [[DataController alloc] init];
        self.dataController = controller;
        [controller release];
        NSLog(@"items: %d",[self.dataController numberOfItems]);
    }
    return self;
}

В этот момент класс DataControlelr загружает объекты из базы данных. Выходные данные журнала показывают "items: 10".

У меня есть TableViewController, где мне нужно использовать DataController.

Заголовок TableViewController:

@interface TableViewController : UITableViewController {
    DataController *dataController;
}

@property (retain) DataController *dataController;
@end

Реализация:

-(id)init{
    if (self =[super init]) {
        DataController *dc  =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataController];
        [dc retain];
        dataController = dc;
        NSLog(@"items: %d",[self.dataController numberOfItems]);
    }
    return self;
}

Здесь всегда говорится, что DataController имеет 0 элементов. "свежее" состояние.

Выход журнала всегда

предметов: 10

предметов: 0

Кажется, что присвоение этого класса создает ссылку на только что инициализированный DataController?

Как правильно ссылаться на другой класс?

Спасибо.

Ответы [ 3 ]

1 голос
/ 01 июня 2009

Первое, что нужно проверить, это убедиться, что переменная dc во втором классе не равна nil, что приведет к тому, что любой вызванный для нее метод вернет 0.

Также может быть полезно распечатать адрес делегата приложения из обоих этих методов - на тот случай, если метод -init является результатом неправильно выделенного второго экземпляра этого класса где-то, тогда как обычная версия не был инициализирован таким же образом (или использовал -initWithCoder: и т. д.)

Одним полезным практическим правилом для инициализации объектов, созданных или назначенных в файле пера, является использование -awakeFromNib для выполнения большинства ваших задач инициализации. Следствием этого является то, что делегат приложения может установить свое состояние в ответ на метод -applicationDidFinishLaunching:. В этом случае, если где-то размещен второй экземпляр вашего класса AppDelegate, только тот, который действительно установлен как делегат приложения, получит -applicationDidFinishLaunching:.

В конце дня вход в отладчик и просмотр стека вызовов должны показать вам, происходит ли что-то не так, как должно.

0 голосов
/ 01 июня 2009

Я нашел гочу. Танки Джиму!

Перемещено назначение из -init в -awakefromnib, и теперь DataController действителен.

Моя ошибка в том, что после помещения кода изначально в -viewDidLoad и -viewWillAppear, что было неправильно, я подумал, что в -init это место для назначения.

0 голосов
/ 01 июня 2009

Может ли быть проблема с вашим назначением dataController = dc в TableViewController? В своем отчете журнала вы используете self.dataController, если ваше назначение прямо над ним будет self.dataController = dc?

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