2013-02-09

XCode 4.6, ARC e Snow Leopard


Verso la fine di Gennaio 2013 è uscita la nuova versione di XCode, la 4.6.
Alcune correzioni e miglioramenti, nessuno molto visibile; un grosso problema, visibile solo a chi ne ha bisogno...
Apple sta consigliando di passare al sistema ARC (Automatic Reference Counting) di gestione della memoria; è un sistema molto semplice, per il quale in sostanza ci si dimentica di gestire la memoria. Durante la compilazione, LLVM si occupa di esaminare il codice e di aggiungere vari comandi retain e release, senza dover essere noi a pensarci; ogni oggetto viene rilasciato immediatamente quando non serve più, con minore occupazione di memoria. Il programmatore ha comunque sempre i mezzi per intervenire e dire al compilatore di gestire in modo diverso.
È un ulteriore passo avanti rispetto alla GC (Garbage Collection), che rilasciava gli oggetti solo in determinati momenti; qui ora può capitare che un oggetto che non viene usato venga distrutto appena creato.
Ok, tutto molto bello. Inoltre, il codice così scritto è indistinguibile da un codice di tempo fa, dove era il programmatore a rilasciare gli oggetti: la sola differenza è che tali istruzioni vengono inserite dal compilatore e non dal programmatore. La stessa Apple invita a non utilizzare più la GC, indubbiamente meno efficiente. Allora, visto che il codice è indistinguibile, un'applicazione compilata in questo modo può girare anche su Snow Leopard (MacOS X 10.6).

Figuratevi la mia sorpresa quando, con XCode 4.6, ho riaperto una app compilata a Dicembre 2012, modificata e, per scrupolo, provata sul 10.6: non partiva nemmeno! Crash immediato!
Ok, torniamo al codice di Dicembre... crash!
Provati un numero innumerevole di esperimenti: nulla! Dato che l'ultimo XCode funzionante su 10.6 era il 4.2 (che però non funziona su MacOS X 10.8, dove gira la versione 4.6), ho collegato i due Mac, aperto da XCode 4.2 il progetto di XCode 4.6 (con un po' di accorgimenti)... il debug diretto non aiutava, anzi: i crash avvenivano in punti diversi ogni volta, come quando c'è un problema nel caricamento dell'interfaccia, che però non aveva senso.
A quel punto è sorto il sospetto: facendo in modo che un oggetto dove avveniva il crash fosse escluso dalla gestione ARC, il crash avveniva in altro oggetto, che, una volta escluso dall'ARC, funzionava.

A quel punto, il sospetto si ingrandiva e potevo fare una ricerca più mirata su Google: eureka!!!
La versione 4.6 si porta dietro un baco (voluto o casuale? Mah...) che impedisce il funzionamento delle app su Snow Leopard!!!
Questo per tutti coloro che vogliono mantenere la compatibilità con Snow Leopard (gli utenti professionali tardano ad aggiornare i loro sistemi, in attesa che tutte le applicazioni acquistate funzionino sul nuovo), si vedono costretti a modificare il codice per tornare al MRC (vedi nota).
La conferma è su questo thread, recentissimo.

Soluzione? Per ora, per quanto ne so, una sola: entrare nel proprio account developer, scaricare XCode 4.5.2 e sostituire con questa l'ultima versione. Appena fatto e tutto funziona.
Ah, sì: fare una segnalazione di baco ad Apple!

EDIT: la nuova versione di Xcode (4.6.1) ha corretto il baco e tornata alla normalità

Nessun commento: