scan - La vinculación débil en el iPhone se niega a funcionar
transferir datos de android a iphone (2)
Tengo una aplicación para iPhone dirigida principalmente a 3.0, pero que aprovecha las API más nuevas cuando están disponibles. El código va algo como esto:
if (UIApplicationDidEnterBackgroundNotification != NULL) {
[nc
addObserver: self
selector: @selector(irrelevantCallbackName:)
name: UIApplicationDidEnterBackgroundNotification
object: nil];
}
Ahora, de acuerdo con todo lo que Apple ha dicho, si las API relevantes están débilmente vinculadas, eso funcionará bien porque el enlazador dinámico evaluará UIApplicationDidEnterBackgroundNotification
a NULL
. Excepto que no lo hace. La aplicación compila, pero tan pronto como golpea if (UIApplicationDidEnterBackgroundNotification != NULL)
se bloquea con EXC_BAD_ACCESS
.
¿Es esto simplemente una cuestión de un indicador de compilador que necesito establecer? ¿O voy por esto de la manera incorrecta?
Aa y yo lo descubrí. Para los símbolos que no son funciones ( extern const int foobar
, por ejemplo), tiene que comparar con la dirección del símbolo, no el símbolo en sí mismo, por lo que:
if (&UIApplicationWillEnterForegroundNotification != NULL)
etc;
Lo cual, en retrospectiva, es algo obvio, pero todavía reprocho a todo el universo que me rodea por no mencionar nunca la distinción.
Esto es lo que tuve que hacer al buscar una constante de marco externo.
const CLLocationAccuracy * ptr = &kCLLocationAccuracyBestForNavigation;
BOOL frameworkSupports = (ptr != NULL);
if (frameworkSupports) {
return kCLLocationAccuracyBestForNavigation;
} else {
return kCLLocationAccuracyBest;
}
No funcionaría sin la variable ptr.