Pagine

2013-05-01

ARC e Snow Leopard

L'Automatic Reference Counting (ARC) è molto comodo: praticamente, ci possiamo quasi dimenticare della gestione della memoria (...il quasi è molto importante, ma per oggi ce ne dimentichiamo...) poiché possiamo essere sicuri che il compilatore gestirà le cose per noi e in modo migliore di come potremmo fare, anche rispetto alla Garbage Collection.
Però... una percentuale di utenti attorno a 20-30% sta ancora usando la versione 10.6 di Mac OS e ci piacerebbe che anche questi utenti potessero usare le nostre app.

La cosa che indispettisce di più è compilare il nostro software, portare il risultato su una macchina con 10.6... e scoprire che non riesce nemmeno a partire: un paio di saltelli nel Dock e chiusura, per di più senza lasciare traccia nella Console di sistema.
Sono i momenti in cui è meglio non essere vicini ad una finestra: si potrebbe rischiare di farci passare il nostro Mac con graziosa parabola...

Quindi, calma e gesso. Allora, non è possibile compilare una applicazione con ARC su Snow Leopard (in quanto Xcode 4.2, l'ultima versione che accetta il 10.6); infatti, per compilare in ARC occorre almeno il 10.7. Se proviamo a farlo su 10.6 otteniamo infatti un errore che ci avvisa di non trovare un file, che è proprio quello che permette di usare l'ARC.
Quindi l'unico modo è quello ufficiale: lavorare su 10.7 o 10.8, impostando l'SDK all'ultima versione, ma ponendo il deployment SDK a 10.6. Ma... il problema di mancato avvio su 10.6?

Dopo un lungo giro su Google, raccogliendo piccoli pezzi da vari post (impossibile listarli tutti, anche se buona parte sono su StackOverflow), alla fine ecco la soluzione!

Occorre selezionare il nostro target, andare sui Build Setting e impostare:

Implicitly Link Objective-C Runtime Support

a NO. Questa impostazione corrisponde alla variabile CLANG_LINK_OBJC_RUNTIME.

App compilata, portata su 10.6 e lanciata: funziona!

Ho cercato in giro per capire il perché sia necessaria questa impostazione, ma non ho trovato nulla di convincente. L'unica spiegazione è sulla repository di Sparkle: "il link implicito all'SDK 10.7 potrebbe inavvertitamente chiamare dei simboli che sul 10.6 non esistono".
L'importante è che funzioni!

Nessun commento:

Posta un commento