2011-01-05 40 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大概是這樣。所以你只是傳遞了錯誤的對象。 只需在錯誤的行中插入一個斷點並查看該對象來自哪裏。

(只是一個猜測:也許你迭代的一些詞典/陣列?因爲字典和數組可以包含任何東西)