Pregunta ¿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


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)


32
2017-10-12 23:30


origen


Respuestas:


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.

Ver la documentación de Apple aquí para el índice de disponibilidad de características 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.


34
2017-10-12 23:34



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

Sin embargo, puede romperse en algunas situaciones. Uno de ellos es, por supuesto, el __weak palabra clave 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 +load método 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 su +load métodos. Para mí funcionó establecer el indicador -fno-objc-arc para ese archivo en particular.

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

11
2017-08-28 07:50