iOS错误选择器错误

时间:2011-01-05 04:59:23

标签: iphone xcode ipad ios ios4

所以我们有一个通用应用程序,并且正在获得一个奇怪的错误,似乎随机iOS框架正在尝试加载我们的方法。所以这里有一些崩溃及其调用的代码。就像我说的似乎每个随机。它发生在应用程序中的随机位置,随机时间以及iPhone和iPad上。

  

[__ NSCFDictionary bannerViewDidLoadAd:]:无法识别的选择器发送到实例0x1f3f30

     

[__ NSArrayM bannerViewDidLoadAd:]:无法识别的选择器发送到实例0x195ea0

     

[UILabel bannerView:didFailToReceiveAdWithError:]:无法识别的选择器发送到实例0x19f950

     

[ADSession bannerViewDidLoadAd:]:无法识别的选择器发送到实例0x106e20

     

[__ 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 个答案:

答案 0 :(得分:4)

  似乎随机iOS框架试图加载我们的方法

你已经倒退了,你将这些消息发送到随机框架对象。这几乎总是表明你有一个指向解除分配对象的指针,而你向该对象发送消息的尝试却被发送到同一内存地址的某个新对象。

您需要查找包含这些方法的类的用户,并确定您尝试访问已发布实例的位置。

答案 1 :(得分:0)

当您尝试将消息发送到没有该方法的对象时,会出现“无法识别的选择器发送到实例”。

例如,NSDictionary没有bannerViewDidLoadAd方法,但ADBannerView可能没有。所以你只是传递了错误的对象。 只需在错误行中加上一个断点,然后查看该对象的来源。

(只是一个猜测:也许你正在迭代一些字典/数组?,因为字典和数组可以包含任何东西)