2011-01-05 78 views
2

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

[__NSCFDictionary bannerViewDidLoadAd:]: unrecognized selector sent to instance 0x1f3f30

[__NSArrayM bannerViewDidLoadAd:]: unrecognized selector sent to instance 0x195ea0

[UILabel bannerView:didFailToReceiveAdWithError:]: unrecognized selector sent to instance 0x19f950

[ADSession bannerViewDidLoadAd:]: unrecognized selector sent to instance 0x106e20

[__NSArrayM bannerView:didFailToReceiveAdWithError:]: unrecognized selector sent to instance 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]; 
     } 
    } 
} 

回答

4

it seems like random iOS frameworks are trying to load our methods

你就是我的倒退,你发送这些消息,以随机框架对象。这几乎总是一个信号,表示您有一个指向释放对象的指针,而您将消息发送到该对象的尝试将被发送到同一内存地址处的某个新对象。

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

+0

你说有关的权利,因为我还挺上泄漏的讨伐声音去和什么可能已经发布有问题。但我真的不知道如何去寻找。我编辑的帖子与我认为可能有问题。 – 2011-01-05 05:55:56

+1

我没有立即看到问题,但没有多大意义。使用NSZombie启用(http://stackoverflow.com/questions/1211923/how-to-use-nszombie-in-xcode)来调试您的应用程序以查找发送到释放实例的消息。还要考虑如果您可以释放您的ADBannerViewDelegate而使用它的视图仍然存在。 – Jonah 2011-01-05 06:29:53

0

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

例如NSDictionary没有bannerViewDidLoadAd方法,但ADBannerView大概是这样。所以你只是传递了错误的对象。 只需在错误的行中插入一个断点并查看该对象来自哪里。

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