J'ai lu et entendu depuis qu'ARC a été annoncé pour la première fois que c'était une chose à la compilation et serait rétro-compatible avec iOS 4. J'ai refacturé avec succès mon projet à ARC en utilisant le refactoring automatique de Xcode 4.2, et compilé iOS 5.0 SDK, ça marche bien. Cependant, si j'essaie de comstackr avec mon iOS 4.2 SDK, il échoue au moment de la binding, manquant les symboles suivants:
J'ai vérifié, et ces symboles sont présents dans 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 que cela signifie que Apple a menti? Je suppose plutôt que je suis confus et que je fais quelque chose de mal, mais je n'arrive pas à comprendre quoi.
C'est avec la version GM de Xcode 4.2 (Build 4C199)
ARC est pris en charge sur iOS 4.3 et versions ultérieures. Vous devez utiliser le SDK iOS 5.x mais pouvez sélectionner iOS 4.3 pour la cible de deployment. La seule chose qui n'est pas supscope dans 4.x est la mise à zéro automatique de reference faible.
Voir la documentation d'Apple ici pour l'index de disponibilité des fonctions Objective-C.
Xcode 4.4 et 4.5 peuvent être utilisés pour soumettre des applications.
Notez que NSDictionary et l'indexing de NSArray sont redéployés sur OS X 10.6 et iOS 4, veillez également à redéfinir la cible de deployment.
Un peu en retard, mais c'est une information importante. La réponse acceptée est correcte, Apple déclare iOS 4.0 et versions supérieures comme OS minimum pour le support ARC.
Cependant, il peut casser dans quelques situations. L'un d'entre eux est bien sûr le mot key __weak
et ses dérivés. Vous verrez une erreur comme celle-ci.
dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak
Une deuxième condition très dangereuse est lorsque vous utilisez la méthode +load
de NSObject. Si vous faites cela en utilisant ARC sur iOS 4.x vous aurez des plantages qui sont très difficiles à find. Si vous obtenez des erreurs d'exécution comme celle-ci, vérifiez vos methods +load
. Pour moi, cela a fonctionné pour définir le drapeau -fno-objc-arc pour ce file particulier.
dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue