2012-06-21 11 views
5

He escrito una clase Singleton para administrar iAds.The iAds emerge después de 5 segundos de la inactividad del usuario. La llamada idleTimerExceeded genera una notificación para mostrar el iAd. Este código funciona bien para mis requisitos, pero como soy nuevo en el desarrollo de iOS, mi aplicación a veces se cuelga inesperadamente después de integrar este código. Este código da como resultado muchas advertencias, etc. Me gustaría optimizar mi código en términos de memoria y rendimiento.Clase Singleton para mostrar iAds para iPhone

Estaría muy agradecido por sus amables sugerencias y comentarios.

A continuación es mi código:

iAdSingleton.h

#import <Foundation/Foundation.h> 
#import "AppDelegate.h" 
#import "iAd/iAd.h" 

@interface iAdSingleton : UIViewController<ADBannerViewDelegate> { 
    ADBannerView *adView; 
    UIViewController *displayVC; 
    NSTimer *idleTimer; 
    BOOL isItFirstTime; 
} 
@property (nonatomic, retain) ADBannerView *adView; 
@property (nonatomic, retain) UIViewController *displayVC; 
@property (nonatomic) BOOL isItFirstTime; 

+ (id) shareAdSingleton; 
- (void) resetIdleTimer; 
- (void) idleTimerExceeded; 

@end 

iAdSingleton.m

#import "iAdSingleton.h" 

@implementation iAdSingleton 

static iAdSingleton* _sharedAdSingleton = nil; 

BOOL bannerVisible = NO; 
BOOL controlAccessBannerVisibility = NO; 
@synthesize adView, displayVC; 
@synthesize isItFirstTime; 

#define kMaxIdleTimeSeconds 5.0 

+(id)sharedAdSingleton 
{ 
    @synchronized(self) 
    { 
     if(!_sharedAdSingleton) 
      _sharedAdSingleton = [[self alloc] init]; 
     return _sharedAdSingleton; 
    } 
    return nil; 
} 

+(id)alloc 
{ 
    @synchronized([iAdSingleton class]) 
    { 
     NSAssert(_sharedAdSingleton == nil, @"Attempted to allocate a second instance of a singleton."); 
     _sharedAdSingleton = [super alloc]; 
     return _sharedAdSingleton; 
    } 

    return nil; 
} 

-(id)init 
{ 
    self = [super init]; 
    if (self != nil) { 

    /*     Initialize The Parameters Over Here     */ 

     //adView = [[ADBannerView alloc] initWithFrame:CGRectMake(0, 480, 0, 0)]; 
     adView = [[ADBannerView alloc] init]; 
     adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait; 
     self.adView.delegate=self; 
     [self resetIdleTimer]; 
    } 
    return self; 
} 

-(void)dealloc 
{ 
    displayVC = nil; 
    if (adView) { 
     [adView removeFromSuperview]; //Remove ad view from superview 
     [adView setDelegate:nil]; 
     adView = nil; 
    } 
    [super dealloc]; 
} 

-(UIViewController *)viewControllerForPresentingModalView 
{ 
    return displayVC; 
} 

- (void)bannerViewDidLoadAd:(ADBannerView *)banner 
{ 
    banner.hidden = NO; 
    if(!bannerVisible){ 
     NSLog(@"Banner Changes 1 - Purpose: Visibility"); 
     // [UIView beginAnimations:@"bannerAppear" context:NULL]; 
     // banner.frame = CGRectOffset(banner.frame, 0, -100); 
     // [UIView commitAnimations]; 
     bannerVisible = YES; 
     controlAccessBannerVisibility = YES; 

    } 
} 

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 
{ 
    //NSLog(@"Unable to receive Ad."); 
    NSLog(@"Banner Changes 2 - Purpose: Unable to Receive Ad."); 
    banner.hidden = YES; 
    if(bannerVisible){ 
     [UIView beginAnimations:@"bannerDisappear" context:NULL]; 
     banner.frame = CGRectOffset(banner.frame, 0, 100); 
     [UIView commitAnimations]; 
     bannerVisible = NO; 
    } 
} 

- (BOOL) bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave 
{ 
    NSLog(@"Pause anything necessary"); 
    return YES; 
} 

- (void) bannerViewActionDidFinish:(ADBannerView *)banner 
{ 
    NSLog(@"We now resume to normal operations"); 
} 

- (void)resetIdleTimer { 

    if (!idleTimer) { 
     idleTimer = [[NSTimer scheduledTimerWithTimeInterval:kMaxIdleTimeSeconds 
                 target:self 
                selector:@selector(idleTimerExceeded) 
                userInfo:nil 
                repeats:NO] retain]; 
    } 
    else { 
     if (fabs([idleTimer.fireDate timeIntervalSinceNow]) < kMaxIdleTimeSeconds-1.0) { 
      [idleTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:kMaxIdleTimeSeconds]]; 
      /* 
      Notification: HideAd 
      */ 

      NSLog(@"Notification Generated For HideAd"); 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"HideAdBanner" object:nil userInfo:nil]; 

     } 
    } 
} 

- (void)idleTimerExceeded { 

    AppDelegate *appDel = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    if (appDel.adVisible == NO) { 
     NSLog(@"Notification Generated For ShowAd"); 

     /* 
     Notification: ShowAd 
     */ 

     if (controlAccessBannerVisibility == YES) { 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"ShowAdBanner" object:nil userInfo:nil]; 
     } 
    } 
} 

@end 
+0

Estoy desarrollando en iOS 5 y usando xcode 4.2. – muneikh

+0

Una vez que se crea iAd singleton, ¿continúa vivo durante el resto de la vida de su aplicación? ¿O lo liberas y lo creas más tarde? – Malcolm

+0

Sí, estoy tratando de tener una instancia de iAd para la vida de la aplicación. – muneikh

Respuesta

3

Esto es lo que necesita. Este código es seguro para subprocesos y no tendrá problemas de memoria ni advertencias.

+ (iAdSingleton *) sharedInstance 
{ 
    static dispatch_once_t onceToken; 
    static iAdSingleton * __sharedInstance = nil; 

    dispatch_once(&onceToken, ^{ 
     __sharedInstance = [[self alloc] init]; 
    }); 

    return __sharedInstance; 
} 
+0

Gracias, una pregunta rápida. ¿Cuál es el mejor enfoque para administrar iAds en una aplicación de barra de pestañas? – muneikh

+0

¿En qué sentido se está acercando a administrar? – Kuldeep

+2

Dado que, después de integrar iAds, experimenté que el rendimiento de mi aplicación se ha ralentizado un poco y que me lleva un poco de tiempo cambiar entre pestañas. – muneikh