Проверьте, существует ли еще делегат, прежде чем вызывать RespondsToSelector - PullRequest
5 голосов
/ 23 февраля 2011

Я создал подкласс UIView для работы с iAds и adMob. Контроллер представления является делегатом подкласса, и все работает хорошо. Иногда, однако, контроллер представления исчезает до того, как реклама была получена. Чтобы решить эту проблему, я установил delegate на nil в реализации dealloc моего контроллера представления.

Проблема, с которой я столкнулся, заключается в том, что иногда метод respondsToSelector: запускается одновременно с освобождением контроллера представления. Это вызывает сбой. Кто-нибудь знает, как мне это переставить?

Просмотр рекламы осуществляется примерно на 10 различных контроллерах просмотра, поэтому я хотел бы создать рекламный код в одном месте.

Большое спасибо

Ответы [ 7 ]

5 голосов
/ 19 июня 2011

Если вы не можете сохранить представление, используйте статический метод, чтобы получить экземпляр, который очищен в dealloc. т.е. вместо:

if (delegate && [delegate respondsToSelector:@selector(...)])

Сделайте это:

if (s_myViewDelegate && [delegate respondsToSelector:@selector(...)])

В классе:

- (id) init {
    s_myViewDelegate = self;
    ...etc...
}

- (void) dealloc {
    s_myViewDelegate = nil;
}
5 голосов
/ 23 февраля 2011

Один простой способ - сохранить представление, пока у вас не будет возможности установить делегат равным нулю, а затем отпустить его.Затем вы можете убедиться, что объект еще жив, и предотвратить сбои.

2 голосов
/ 26 марта 2012

Хотя это вопрос давным-давно, я действительно немного с ним связался и, наконец, нашел что-то, что могло бы помочь.

Установите блок завершения вместо делегата для завершенного или неудачного события, и это поможет.

2 голосов
/ 23 февраля 2011
if (delegate && [delegate respondsToSelector:@selector(...)])
0 голосов
/ 21 ноября 2012

Существует быстрое и не очень хорошее решение - использовать блок @ try / @ catch. Просто если вы попадете в блок @catch, ваш делегат точно не выполнится ... например:

@try{    
     if (delegate && [delegate respondsToSelector:@selector(...)])
     [delegate callBackMethod];
}
@catch (NSException *e){
     // if you get here then delegate is no longer valid regardless its reference is still valid
}
0 голосов
/ 18 июня 2011

Да, это проблема с iAd и admob. У меня была такая проблема. Я решил эту проблему, добавив представление add в главном окне и сделав делегат делегату приложения, чтобы делегат приложения никогда не освобождался, пока вы не закроете приложение.

0 голосов
/ 18 июня 2011

У вас не должно быть 10 отдельных просмотров объявлений, что неправильно на многих уровнях.Вместо этого у вас должен быть только один, который вы либо перемещаете между отдельными представлениями, либо - умнее - просто держитесь сверху.

Например, вы можете добавить представление к tabBarController.view, и оно останется, даже если вы переключаете вкладки.,Если вы не хотите показывать рекламу, вы можете просто скрыть ее.

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