Objective-C: переменная-член теряет ссылку между вызовами методов - PullRequest
1 голос
/ 03 апреля 2010

Я имел дело с классом target-c, который, похоже, теряет ссылку на указатель между методами одного и того же класса.

В файле MyTableViewController.h я заявляю:

@interface SettingsTableViewController : UITableViewController <UITextFieldDelegate>{
    OCRAppDelegate *delegate;
}

Файл MyTableViewController.m

- (id) init {
    self = [ super initWithStyle: UITableViewStyleGrouped ];
    delegate = [(OCRAppDelegate *)[[UIApplication sharedApplication] delegate] retain];
}

Проблема в том, что снова появляется представление «MyTableViewController» и в этом же классе выполняется другой метод, указатель делегата (назначенный во время метода init) больше не существует. Я пытался сохранить, но безрезультатно.

Кто-нибудь знает, почему это так, может быть, это фундаментальная проблема Objective-C, которую я упускаю.

Ценю вашу помощь.

Спасибо, Winston

Ответы [ 3 ]

1 голос
/ 04 апреля 2010

Тот факт, что метод init ничего не возвращает, может быть причиной проблемы - он должен возвращать 'self'.

- (id) init {
    if (self = [super initWithStyle:UITableViewStyleGrouped]) {
        delegate = [(OCRAppDelegate *)[[UIApplication sharedApplication] delegate] retain];
    }
    return self;
}
0 голосов
/ 05 апреля 2010

Я думаю, что, возможно, нашел ответ.

Для любых инициализаций для класса это должно быть сделано в ViewDidLoad. До этого я считаю, что в методе init класс не был полностью настроен.

Что интересно для всех других моих представлений, ViewDidLoad вызывается, когда представление собирается быть загруженным, поэтому все мои переменные / указатели существуют. Однако в приведенном выше классе метод viewdidload вызывается очень рано, и указатель делегата обратно на делегат приложения не был полностью настроен.

0 голосов
/ 03 апреля 2010

Когда вы говорите, что его больше нет, что вы имеете в виду? На что изменилось его значение?

Если значение равно 0x0 (т.е. nil), либо что-то изменило его на nil, либо оно всегда было nil. Вы проверили, что это не ноль, когда вы назначаете его? Возможно с NSLog заявлением.

Я подозреваю, что, поскольку он работает в методе viewWillAppear, но не в методе init, делегат приложения не был инициализирован в точке вызова метода init, поэтому вы фактически устанавливаете его в ноль .

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