2011-02-23 6 views
5

He hecho una subclase UIView para tratar con iAds y adMob. El controlador de vista es el delegado de la clase secundaria y todo funciona bien. A veces, sin embargo, el controlador de vista desaparece antes de que se haya obtenido el anuncio. Para resolver esto establecí el delegate en nil en la implementación dealloc del controlador de mi vista.Compruebe si el delegado aún existe antes de llamar a respondsToSelector

El problema que tengo es que a veces el método respondsToSelector: se ejecuta al mismo tiempo que el controlador de vista se desasigna. Esto causa un bloqueo. ¿Alguien sabe cómo puedo reorganizar esto?

La vista del anuncio está en aproximadamente 10 diferentes controladores de vista, por lo que me gustaría un lugar para crear el código del anuncio.

Muchas Gracias

Respuesta

5

Una forma fácil es retener la vista hasta que tuvo la oportunidad de establecer el delegado a cero y, a continuación, suéltelo. Luego puede asegurarse de que el objeto aún esté vivo y evitar bloqueos.

+2

Adición: El delegado de un objeto siempre debe vivir más tiempo, entonces sí (es superior en la jerarquía).. Y si se desasigna, debería limpiar su desorden. Se ha establecido como delegado, por lo que debe restablecer el delegado a cero cuando se desasigna. –

2
if (delegate && [delegate respondsToSelector:@selector(...)]) 
+0

Im ya haciendo esto pero :( – user609906

+4

Esto es equivalente a 'if ([delegate respondsToSelector: @selector (...)])', ya que el envío de un mensaje a nil devuelve 0. Comprobar si 'delegate == nil' no es válido forma de ver si el delegado ha sido desasignado. –

-1

No debe tener 10 vistas de anuncios individuales, eso está mal en muchos niveles. En su lugar, debe tener solo una que se mueva entre las vistas individuales o, más inteligente, simplemente mantenerse arriba.

Puede, por ejemplo, agregar una vista a tabBarController.view y esto permanecerá presente incluso si cambia de pestaña. Para las vistas en las que no desea que aparezca el anuncio, simplemente puede ocultarlo.

0

Sí, es un problema con iAd y admob. También tuve este tipo de problema. He resuelto el problema agregando agregar vista en la ventana principal y delegar en el delegado de la aplicación para que el delegado de la aplicación nunca se desasignara hasta que cierre la aplicación.

5

Si no puede conservar la vista, utilice un método estático para obtener la instancia que se borra en dealloc. es decir: en lugar de:

if (delegate && [delegate respondsToSelector:@selector(...)]) 

Haga lo siguiente:

if (s_myViewDelegate && [delegate respondsToSelector:@selector(...)]) 

En la clase:

- (id) init { 
    s_myViewDelegate = self; 
    ...etc... 
} 

- (void) dealloc { 
    s_myViewDelegate = nil; 
} 
2

Aunque se trata de una pregunta desde hace mucho tiempo, realmente en mal estado con él un poco y, finalmente, encontré algo que podría ayudar.

Establezca un completion block en lugar de un delegado para el evento finalizado o fallido, y esto ayudaría.

+0

No se olvide de usar las referencias '__weak' dentro del bloque de finalización o puede obtener algunos errores extraños.Recuerde, cualquier variable capturada en el objeto bloque se conserva de forma predeterminada. –

+0

¡Salud! Recordatorio útil. Me olvido de usar _weak ... – BabyPanda

+0

¿Puede proporcionar algunos ejemplos de códigos o guías? Tengo este problema de delegado similar, pero no tengo idea de cómo empezar con el uso del bloque de finalización. ¡Gracias! – Hexark

-1

En realidad, existe una solución rápida y no muy buena: utilizar @ try/@ catch block. Sólo si se llega a la @catch bloquear su delegado falla a ciencia cierta ... como:

@try{  
    if (delegate && [delegate respondsToSelector:@selector(...)]) 
    [delegate callBackMethod]; 
} 
@catch (NSException *e){ 
    // if you get here then delegate is no longer valid regardless its reference is still valid 
} 
+3

Estás equivocado. Los bloques Try-catch solo se usan para errores de programadores: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/ErrorHandling/ErrorHandling.html%23//apple_ref/doc/uid/TP40011210 -CH9-SW3 –

+0

¿Dónde estoy equivocado? Dije que "esta no es una buena solución". ¿Estás tratando de decir que esta solución es bastante buena o qué? No es una solución en absoluto? Ok, intenta encontrar un mundo/vida/hombre ideal, etc. – Stan

Cuestiones relacionadas