Мой uitableview.delegate становится равным нулю.Есть идеи почему или как я могу понять почему? - PullRequest
0 голосов
/ 13 марта 2012

Полагаю, это не обычная проблема, что затрудняет ответ. Любая помощь приветствуется.

Мне нужно вызывать этого делегата несколько раз в моем приложении, и я заметил, что через некоторое время делегат начинает возвращаться как NULL (и, следовательно, перестает отвечать). Я помещаю nslog везде, где вызывается делегат, так что я знаю, что на данный момент все нормально:

UIImage *image = [self.delegate largeThumnailForMediaAtIndex:indexPath.row];

Затем, когда в следующий раз вызывается эта строка, делегату присваивается значение NULL. Никакие линии вокруг этого не вызывают или устанавливают делегата. Я также добавил NSLog в метод setDelegate, и он не вызывался до того, как он изменился на NULL.

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

Спасибо за вашу помощь.

РЕДАКТИРОВАТЬ: Странно, но может помочь привести к решению. Я поместил NSTimer scheduleTimer .. в класс, который получает делегат, и заставил его запускать его раз в секунду, чтобы я мог видеть, стал ли он нулевым в любой момент. Однако результат, который я получил, заключался в том, что на этот раз он не обнулился. Он вернул все методы делегата. Когда я вынул таймер, он возвращается к NULL. Очевидно, что наличие таймера - это странное обходное решение. Я надеюсь, что это кому-то звонит и дает понять, в чем проблема?

РЕДАКТИРОВАТЬ 2: я решил эту проблему, вместо того, чтобы использовать этот код в моем AppDelegate:

JCreateViewController *create = [[JCreateViewController alloc] init];
    [create.navigationBar addLeftButtonWithTitle:@"Back" type:JButtonTypeArrow];
   create.navigationBar.title = @"Entry #17";
    [self.window addSubview:create.view];

Объявление его в моем заголовочном файле с последующим использованием:

self.create = [[JCreateViewController alloc] init];
    [self.create.navigationBar addLeftButtonWithTitle:@"Back" type:JButtonTypeArrow];
    self.create.navigationBar.title = @"Entry #17";
    [self.window addSubview:self.create.view];

Я не понимаю, почему это имеет значение, хотя. Я хотел бы знать, если кто-нибудь знает?

1 Ответ

3 голосов
/ 13 марта 2012

Похоже, вы используете ARC. Каким бы ни был этот объект, ничто не владеет им. Ничто не имеет строгой ссылки на него, поэтому оно освобождается, а затем в какой-то момент освобождается.

JCreateViewController *create = [[JCreateViewController alloc] init];

Это локальная переменная. Когда переменная выходит из области видимости в конце метода, вы больше не можете получить доступ к этому объекту. При MRR это будет утечка. Под ARC объект умирает, как и в пуле авто-релиза.

self.create = [[JCreateViewController alloc] init];

Создав свойство (предположительно strong) и поместив контроллер в это свойство, вы дали все, что self является ссылкой на контроллер. Теперь он будет действовать до тех пор, пока свойство не будет переназначено или установлено на nil.

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

Короче говоря, убедитесь, что кому-то принадлежит этот объект, и он останется вокруг.

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