iphone ios ios4 automatic-ref-counting xcode4.2

iphone - ¿ARC es realmente compatible con iOS 4? El iOS 4.2 SDK no tiene símbolos relacionados con ARC en el momento de la vinculación



ios4 automatic-ref-counting (2)

He leído y oído 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 utilizando la refactorización automática de Xcode 4.2, y cuando compilado contra el iOS 5.0 SDK, funciona bien. Sin embargo, si trato de compilar contra mi iOS 4.2 SDK, falla en el momento del enlace, y me faltan los siguientes símbolos:

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

Lo comprobé, y estos símbolos están presentes en 5.0 pero no en 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* ...]

¿Esto significa que Apple mintió? Supongo que estoy confundido y haciendo algo mal, pero no puedo entender qué.

Esto es con el lanzamiento de GM de Xcode 4.2 (Build 4C199)


ARC es compatible con 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 obtener el índice de disponibilidad de funciones de Objective-C.

Xcode 4.4 y 4.5 se pueden usar para enviar aplicaciones.

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


Un poco tarde, pero esta es información importante. La respuesta aceptada es correcta, Apple afirma que iOS 4.0 y superior son el SO mínimo para el soporte de ARC.

Sin embargo, puede romperse 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 y muy peligrosa condición es cuando usa el método +load de NSObject. 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 de 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