2011-10-12 10 views
31

Ho letto e ascoltato da quando ARC ha annunciato per la prima volta che si trattava di una cosa in fase di compilazione e sarebbe retrocompatibile con iOS 4. Ho correttamente rifatto il mio progetto ad ARC usando il refactoring automatico di Xcode 4.2, e quando è compilato con l'SDK di iOS 5.0, funziona perfettamente. Tuttavia, se provo a compilare contro i miei iOS 4.2 SDK, non riesce in fase di collegamento, mancano i seguenti simboli:ARC è realmente supportato in iOS 4? L'SDK di iOS 4.2 manca dei simboli relativi all'ARC al tempo di collegamento

  • _objc_retainAutoreleaseReturnValue
  • _objc_autoreleaseReturnValue
  • _objc_storeStrong
  • _objc_retain
  • _objc_release
  • _objc_retainAutoreleasedReturnValue
.210

ho controllato, e questi simboli sono presenti in 5.0, ma non 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* ...] 

Significa questo che Apple ha mentito? Suppongo invece di essere confuso e di fare qualcosa di sbagliato, ma non riesco a capire cosa.

Questo è con il rilascio di GM Xcode 4.2 (build 4C199)

+0

Penso che sia necessario iOS 4.3. – ughoavgfhw

+3

Oltre a ciò che altri hanno detto, non installare l'SDK 4.2. Utilizzare l'SDK 5.0. Imposta il tuo obiettivo di distribuzione. Non intendo per questo, intendo in generale; gli SDK meno recenti non dovrebbero essere usati. –

+1

Wow, non posso credere di aver passato così tanto tempo senza sapere che i nuovi SDK potrebbero essere costruiti per versioni del sistema operativo precedenti. Qui sono stato arrabbiato con Apple che stavano cancellando tutte le mie vecchie versioni di SDK:/Grazie! –

risposta

34

ARC è supportata su IOS 4.3 e sopra. È necessario utilizzare l'SDK iOS 5.x ma è possibile selezionare iOS 4.3 per il target di distribuzione. L'unica cosa che non è supportata in 4.x è l'azzeramento di riferimento debole automatico.

Vedere la documentazione Apple here per l'indice di disponibilità delle funzioni Objective-C.

Xcode 4.4 e 4.5 possono essere utilizzati per inviare app.

Nota che gli elenchi di NSDictionary e NSArray si riferiscono a OS X 10.6 e iOS 4, assicurati di reimpostare anche l'obiettivo di distribuzione.

+0

Grazie (facepalm). Sembra che stia funzionando anche con 4.2 come obiettivo di distribuzione, tuttavia ...andando a testare su un dispositivo reale ora. –

+0

Sembra funzionare bene anche sul mio dispositivo, con iOS 4.2.1. –

+0

L'aggiornerò se vengo rifiutato :) Grazie ancora. –

11

Un po 'in ritardo, ma questa è un'informazione importante. La risposta accettata è corretta, Apple states iOS 4.0 and above come sistema operativo minimo per il supporto ARC.

Tuttavia, può rompere in alcune situazioni. Uno di questi è ovviamente la parola chiave __weak e le sue derivate. Verrà visualizzato un errore simile al seguente.

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

Un secondo e molto pericoloso condizione è quando si utilizza il metodo di NSObject +load. Se lo fai usando ARC su iOS 4.x avrai dei crash di runtime che sono molto difficili da trovare. Se ricevi errori di runtime come quelli che seguono, controlla i tuoi metodi +load. Per me ha funzionato per impostare il flag -fno-objc-arc per quel particolare file.

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

Questa seconda parte che hai menzionato è tornata a perseguitarmi, andando in crash in '+ load'. Scenderemo presto iOS 4.3 ma devo fornire un altro aggiornamento di lavoro per alcune persone che si rifiutano di aggiornare 4.3 a 5 o 6, gaaaah. – Pascal