32 votes

ARC est-il vraiment pris en charge dans iOS 4 ? L'iOS 4.2 SDK manque des symboles liés à l'ARC au moment de lier

J'ai lu et entendu depuis l'ARC a été le premier a annoncé qu'il était au moment de la compilation chose et serait compatible avec iOS 4. Je l'ai refait mon projet à l'ARC à l'aide de Xcode 4.2 automatique de refactoring, et quand compilé avec la version 5.0 d'iOS SDK, il fonctionne très bien. Cependant, si j'essaie de compiler contre mon iOS 4.2 SDK, il échoue au moment de la liaison, manquant les symboles suivants:

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

J'ai vérifié, et ces symboles sont présents dans la version 5.0, mais pas 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* ...]

Est-ce à dire qu'Apple a menti? Je suppose plutôt que je suis confus et faire quelque chose de mal, mais je ne peux pas comprendre ce que.

C'est avec le GM version de Xcode 4.2 (Build 4C199)

34voto

Zaph Points 40557

L'ARC est pris en charge sur iOS 4.3 et au-dessus. Vous devez utiliser l'iOS 5.x SDK mais pouvez sélectionner l'iOS 4.3 pour la Cible de Déploiement. La seule chose qui n'est pas pris en charge dans les 4.x est automatique référence faible du point zéro.

Voir la documentation d'Apple ici pour l'Objectif-C Indice de Disponibilité.

Xcode 4.4 et 4.5 peut être utilisé pour soumettre des applications.

Notez que NSDictionary et NSArray subscripting déploie retour à OS X 10.6 et iOS 4, assurez-vous de définir la cible de déploiement du dos ainsi.

11voto

Paul de Lange Points 6152

Un peu de retard, mais c'est une information importante. L'on a accepté la réponse est correcte, Apple états iOS 4.0 et ci-dessus que le minimum du système d'exploitation à l'ARC de soutien.

Toutefois, il peut se casser dans quelques situations. L'un d'entre eux est bien sûr l' __weak mot-clé et de ses dérivés. Vous verrez un message d'erreur semblable à la suivante.

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

Une deuxième et d'une situation très dangereuse, c'est quand vous utilisez l' +load méthode de NSObject. Si vous faites cela, l'aide de l'ARC sur iOS 4.x, vous devrez d'exécution accidents qui sont très difficiles à trouver. Si vous obtenez des erreurs d'exécution comme la suivante, vérifiez votre +load méthodes. Pour moi, il a travaillé pour définir le -fno-objc-arc drapeau pour ce fichier en particulier.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X