Ошибка плохого селектора iOS - PullRequest
2 голосов
/ 05 января 2011

Итак, у нас есть универсальное приложение, и мы получаем странную ошибку, когда кажется, что случайные фреймворки iOS пытаются загрузить наши методы.Итак, вот некоторые из сбоев и код его вызова.Как я уже сказал, это кажется случайным.Это происходит в случайных местах в приложении и в случайное время, а также на iPhone и iPad.

[__ NSCFDictionary bannerViewDidLoadAd:]: нераспознанный селектор, отправленный экземпляру 0x1f3f30

[__ NSArrayM bannerViewDidLoadAd:]: нераспознанный селектор отправлен в экземпляр 0x195ea0

[UILabel bannerView: didFailToReceiveAdWithError:]: нераспознанный селектор отправлен в экземпляр 0x19f950

[ADSession bannerViewDidLoadAd:]: нераспознанный селектор 1010 * 1010 020 отправлен в экземпляр* [__ NSArrayM bannerView: didFailToReceiveAdWithError:]: нераспознанный селектор, отправленный экземпляру 0x521b670

И вот код, на который они ссылаются.По любой причине ...

- (void)bannerViewDidLoadAd:(ADBannerView *)banner {
    if (!_adBannerViewIsVisible) {                
        _adBannerViewIsVisible = YES;
        [self fixupAdView:[UIDevice currentDevice].orientation];
        NSLog(@"iAD Loaded");
    }
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {

    NSLog(@"%@",error);

    if (_adBannerViewIsVisible)
    {        
        _adBannerViewIsVisible = NO;
        [self fixupAdView:[UIDevice currentDevice].orientation];
        NSLog(@"iAD Unloaded");

    }
}

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

- (void)createAdBannerView {
    Class classAdBannerView = NSClassFromString(@"ADBannerView");
    if (classAdBannerView != nil) {
        [classAdBannerView release];
        [self.adBannerView release];
        self.adBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
        [_adBannerView setRequiredContentSizeIdentifiers:[NSSet setWithObjects: ADBannerContentSizeIdentifierPortrait, ADBannerContentSizeIdentifierLandscape, nil]];
        if (UIInterfaceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
            [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierLandscape];
        } else {
            [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierPortrait];            
        }
        [_adBannerView setFrame:CGRectOffset([_adBannerView frame], 0, -[self getBannerHeight])];
        [_adBannerView setDelegate:self];

        [self.view addSubview:_adBannerView];        
    }
}

- (void)fixupAdView:(UIInterfaceOrientation)toInterfaceOrientation {
    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"isadFreeUpgradePurchased"]) {
        if (_adBannerView != nil) {        
            if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
                [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierLandscape];
            } else {
                [_adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifierPortrait];
            }          
            [UIView beginAnimations:@"fixupViews" context:nil];
            if (_adBannerViewIsVisible) {
                CGRect adBannerViewFrame = [_adBannerView frame];
                adBannerViewFrame.origin.x = 0;
                adBannerViewFrame.origin.y = 0;
                [_adBannerView setFrame:adBannerViewFrame];
                CGRect contentViewFrame = _contentView.frame;
                contentViewFrame.origin.y = [self getBannerHeight:toInterfaceOrientation];
                contentViewFrame.size.height = self.view.frame.size.height - [self getBannerHeight:toInterfaceOrientation];
                _contentView.frame = contentViewFrame;
            } else {
                CGRect adBannerViewFrame = [_adBannerView frame];
                adBannerViewFrame.origin.x = 0;
                adBannerViewFrame.origin.y = -[self getBannerHeight:toInterfaceOrientation];
                [_adBannerView setFrame:adBannerViewFrame];
                CGRect contentViewFrame = _contentView.frame;
                contentViewFrame.origin.y = 0;
                contentViewFrame.size.height = self.view.frame.size.height;
                _contentView.frame = contentViewFrame;            
            }
            [UIView commitAnimations];
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 05 января 2011

похоже, что случайные фреймворки iOS пытаются загрузить наши методы

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

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

0 голосов
/ 05 января 2011

Вы получаете «нераспознанный селектор, отправленный экземпляру», когда вы пытаетесь отправить сообщение объекту, у которого нет этого метода.

Например, NSDictionary не имеет метода bannerViewDidLoadAd, но, по-видимому, имеет ADBannerView.Так что вы просто пропускаете не тот объект.Просто установите точку останова в строке ошибки и посмотрите, откуда этот объект.

(просто предположение: может быть, вы итерируете какой-то словарь / массив ?, потому что словари и массивы могут содержать что угодно)

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