2013-09-25 1 views
0

Я получаю странный сбой с обратным вызовом ошибки iAd. Вот мой краш журнала:Crash с iAd только на iOS 7 - слабый делегат - плохой указатель

Exception Type: EXC_BAD_ACCESS Code: KERN_INVALID_ADDRESS at 0x2281 
0com.apple.main-thread Crashed 
0 libobjc.A.dylib  objc_retain + 17 
1 YouDoodle AdView.m line 265 -[AdContainerView requestGAD] 
2 iAd  -[ADBannerView _forwardErrorToDelegate:] + 254 
3 iAd  -[ADBannerView serverBannerViewDidFailToReceiveAdWithError:] + 178 
4 iAd  -[ADAdSpace setServiceAdSpace:] + 472 
5 CoreFoundation __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12 
6 CoreFoundation _CFXNotificationPost + 1718 
7 Foundation -[NSNotificationCenter postNotificationName:object:userInfo:] + 76 
8 Foundation -[NSNotificationCenter postNotificationName:object:] + 30 
9 iAd  -[ADAdSheetProxy _adSheetConnectionLost] + 292 
10 ... libdispatch.dylib _dispatch_call_block_and_release + 10 
11 libdispatch.dylib _dispatch_client_callout + 22 
12 libdispatch.dylib _dispatch_main_queue_callback_4CF$VARIANT$up + 274 
13 CoreFoundation __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8 
14 CoreFoundation __CFRunLoopRun + 1300 
15 CoreFoundation CFRunLoopRunSpecific + 522 
16 CoreFoundation CFRunLoopRunInMode + 106 
17 GraphicsServices GSEventRunModal + 138 
18 UIKit UIApplicationMain + 1136 
19 YouDoodle 
AppDelegate.m line 129 
main 

http://crashes.to/s/c654d14dcfa

делегат обратного вызова для ОВР:

- (void) bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 
{ 
    DLog(@"IAD Failed to load with error %@", error); 

    self.adBannerContainer.hidden = YES; 

    if (InternetAvailableWithAlert(NO)) 
    { 
     if (self.gadAvailable) 
     { 
      self.gadBannerContainer.hidden = NO; 
     } 
     else 
     { 
      [self requestGAD]; 
     } 
    } 
} 

- (void) requestGAD 
{ 
    GADRequest* request = [[GADRequest alloc] init]; 

#if TARGET_IPHONE_SIMULATOR 

    request.testDevices = @[GAD_SIMULATOR_ID]; 

#endif 

    self.gadBanner.rootViewController = (self.gadBanner.rootViewController ?: self.viewController); 
    [self.gadBanner loadRequest:request]; 
} 

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

@property (nonatomic, weak) id<ADBannerViewDelegate> delegate; 

Идеи?

+0

Похоже, что авария происходит внутри вашего метода '[AdContainerView requestGAD]'. Как выглядит этот метод? Что на линии 265? –

+0

@BrianNickel Я обновил вопрос с помощью обратного вызова делегата для iAd. Линия 265 находится у основания. – jjxtra

+0

@BrianNickel В этом случае self IS является делегатом, поэтому он должен быть либо допустимым указателем на действительный объект, либо nil, и в этом случае обратный вызов делегата не должен произойти, если я не пропущу что-то. Не происходит на iOS 6, поэтому мне кажется, что это ошибка iOS 7. – jjxtra

ответ

0

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