2011-10-12 10 views
31

He leído y escuchado desde que ARC se anunció por primera vez que era una cosa de tiempo de compilación y sería compatible con iOS 4. He rediseñado mi proyecto con éxito a ARC usando la refactorización automática de Xcode 4.2, y cuando se compila contra el iOS 5.0 SDK, funciona bien. Sin embargo, si intento compilar contra mis iOS 4.2 SDK, se produce un error en tiempo de enlace, faltan los siguientes símbolos:¿ARC es realmente compatible con iOS 4? El iOS 4.2 SDK no tiene símbolos relacionados con ARC en el tiempo de vinculación

  • _objc_retainAutoreleaseReturnValue
  • _objc_autoreleaseReturnValue
  • _objc_storeStrong
  • _objc_retain
  • _objc_release
  • _objc_retainAutoreleasedReturnValue

yo sepa, y estos símbolos están presentes en 5.0, pero no 4.2:

iPhoneOS5.0.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$ 
00005ed0 T _objc_retain 
000061d0 T _objc_retain 

iPhoneOS4.2.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$ 
[... *crickets* ...] 

¿Quiere decir esto que Apple mentido? Supongo que estoy confundido y haciendo algo mal, pero no puedo entender qué.

esto es con la liberación de GM de Xcode 4.2 (Build 4C199)

+0

Creo que requiere iOS 4.3. – ughoavgfhw

+3

Además de lo que otros han dicho, no instale el 4.2 SDK. Use el 5.0 SDK. Establezca su destino de despliegue. No me refiero a esto, quiero decir en general; los SDK anteriores no deberían usarse. –

+1

Wow, no puedo creer que haya pasado tanto tiempo sin saber que los nuevos SDK podrían compilarse para versiones anteriores del sistema operativo. Aquí he estado enojado con Apple porque han estado borrando todas mis versiones antiguas de SDK: ¡Gracias! –

Respuesta

34

ARC se admite en iOS 4.3 y superior. Debe usar iOS 5.x SDK, pero puede seleccionar iOS 4.3 para el objetivo de implementación. Lo único que no se admite en 4.x es la reducción a cero de referencia automática.

Consulte la documentación de Apple here para el índice de disponibilidad de funciones de Objective-C.

Xcode 4.4 y 4.5 se pueden utilizar para enviar aplicaciones.

Tenga en cuenta que las subscripciones NSDictionary y NSArray se implementan en OS X 10.6 y iOS 4, asegúrese de establecer también el destino de despliegue.

+0

Gracias (facepalm). En realidad, parece estar trabajando con 4.2 como destino de despliegue también, sin embargo ...va a probar en un dispositivo real ahora. –

+0

Parece funcionar bien en mi dispositivo también, ejecutando iOS 4.2.1. –

+0

Actualizaré esto si me rechazan :) Gracias de nuevo. –

11

Un poco tarde, pero esta es información importante. La respuesta aceptada es correcta, Apple states iOS 4.0 and above como el SO mínimo para el soporte de ARC.

Sin embargo, se puede romper en algunas situaciones. Uno de ellos es, por supuesto, la palabra clave __weak y sus derivados. Verás un error como el siguiente.

dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak 

Una segunda condición y muy peligroso es cuando se utiliza el método de NSObject +load. Si haces esto usando ARC en iOS 4.x, tendrás bloqueos en el tiempo de ejecución que son muy difíciles de encontrar. Si obtiene errores en tiempo de ejecución como el siguiente, verifique sus métodos +load. Para mí funcionó establecer el indicador -fno-objc-arc para ese archivo en particular.

dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue 
+0

Esa segunda parte que mencionas ha regresado para atormentarme, bloquear en '+ load'. Lanzaremos iOS 4.3 pronto, pero tengo que proporcionar una actualización de trabajo más para algunas personas que se niegan a actualizar 4.3 a 5 o 6, gaaaah. – Pascal

Cuestiones relacionadas