2011-10-14 10 views
28

Sommario:È possibile aggiungere alla lista di controllo le cose a cui prestare attenzione durante la migrazione su iOS 5? StackOverflow è stato di valore inestimabile dato che ho lavorato all'aggiornamento su iOS 5. Ho scoperto alcune cose basilari che avevo perso prima di Xcode 4.2, e mi chiedo quali altri "trucchi" potrebbero essere in agguato.A cosa prestare attenzione quando si esegue la transizione a iOS 5

Dettaglio: Con la spedizione di iOS 5 questa settimana, ho dovuto apportare alcune modifiche a un paio delle mie app. Xcode 4.2 fa un lavoro molto migliore analizzando il codice di gestione della memoria a causa della nuova funzionalità ARC. L'aggiornamento di iOS 5 è un ottimo punto in cui rivedere tutto il codice di gestione della memoria. Il nuovo compilatore trova anche una serie di altri problemi che i compilatori precedenti non avevano notato. Complimenti agli ingegneri del compilatore Apple. Ecco le principali cose che hanno aiutato (e molte di esse si applicano anche alle versioni precedenti di iOS).

  1. Assicurarsi di call [super dealloc] at the END of your dealloc methods, non l'inizio.
  2. In viewDidUnload, some people have reported bugs that require [super viewDidUnload] to be called at the end, non l'inizio, del tuo viewDidUnload.
  3. Comprendere i conteggi dei ritardi, i setter sintetizzati e quando chiamare il rilascio o il rilascio automatico. Il nuovo compilatore mostrerà più problemi rispetto ai vecchi compilatori. (Pensavo di essere stato attento, ma a quanto pare non ero abbastanza attento.) È necessario leggere lo memory management guide di Apple: nessuna scorciatoia.
  4. È una buona idea di turn on zombies when debugging (in Xcode, selezionare Prodotto | Modifica schema ... e selezionare lo schema Debug; nella scheda Diagnostica, selezionare Abilita oggetti Zombie). Questo può aiutarti a trovare i tentativi di utilizzo degli zombi (oggetti che non dovresti usare più).
  5. Lo strumento Leaks è anche utile. Esegui la tua app in modalità Profilo e scegli il modello Leaks. Nella finestra Strumenti, seleziona lo strumento Perdite e seleziona la casella "Raccogli contenuti in memoria trapelati" e ti aiuterà a vedere dove la memoria trapelata ha origine nel tuo codice.

ci sono un paio di cianfrusaglie che ho incontrato:

  • di Apple singleton pattern esigenze "senso unico", ha aggiunto alla dichiarazione tipo di ritorno:
 
    - (oneway void) release { } 

Qualche altro suggerimento di potenziali insidie ​​che dovrei cercare? Ho la sensazione che le mie app siano più stabili ora, ma mi sentivo abbastanza bene con loro prima.

+1

Non è la gestione della memoria, ma è comunque importante: se si scaricano dati e si desidera salvarli sul dispositivo, fare attenzione a non salvarli nella cartella dei documenti. Usa Library/Caches o tmp per quello. Oppure memorizzare i dati dell'applicazione in NSApplicationSupportDirectory aggiunto dal proprio ID bundle. vedi http://developer.apple.com/library/mac/#documentation/FileManagement/Conceptual/FileSystemProgrammingGUide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW1 per i dettagli. –

+1

Neanche la gestione della memoria. Ma se stai facendo roba relativa a sicurezza/certificato. Tenete presente che i certificati con hash MD5 restituiscono kSecTrustResultRecoverableTrustFailure su SecTrustEvaluate. Perché ios5 considera gli hash MD5 non sicuri. – n3utrino

+1

Un'altra cosa per la migrazione a IOS5 è l'UDID deprecato. http://stackoverflow.com/questions/6993325/uidevice-uniqueidentifier-deprecated-what-to-now –

risposta

6

1/I controller modali si comportano diversamente, se si modifica la loro dimensione. Se hai bisogno di una finestra di dialogo modale di dimensioni diverse, prendi in considerazione l'utilizzo di controller di visualizzazione figlio per iOS 5.

2/Per un tavolo, se si restituisce intestazione della sezione nil e altezza positiva, in iOS 4, l'intestazione era nascosta. In iOS 5, devi restituire zero altezza per le intestazioni nil.

3/UDID è obsoleto. Puoi utilizzare CFUUIDCreate per creare un ID univoco e salvarlo nelle tue impostazioni, ma tieni presente che è possibile eseguire il backup dei dati di un dispositivo e ripristinarlo su un altro dispositivo, lasciandoti due dispositivi con lo stesso ID.Ho risolto la situazione salvando il mio id nel portachiavi con l'attributo kSecAttrAccessibleWhenUnlockedThisDeviceOnly.

Informazioni sul proprio elenco: [super viewDidUnload] deve essere sempre chiamato come ultima istruzione nel viewDidUnload. La logica è la stessa di [super dealloc]. Nota che dovresti chiamare [self viewDidUnload] nel tuo dealloc (se non hai già rilasciato la tua memoria lì) perché non è chiamato implicitamente (anche se a volte lo è).

Dai miei esperimenti, il rilevamento delle perdite in Strumenti non segnala perdite su proprietà che sono sintetizzate senza assegnare un nome di proprietà.

+0

Grazie per la risposta. Potresti chiarire qualcosa per me? Penso che stiamo dicendo la stessa cosa sulla questione di quando chiamare [super viewDidUnload]. Inoltre, migliorerebbe la tua risposta per illustrare più chiaramente il suggerimento delle circostanze in cui dovresti chiamare [self viewDidUnload]. –

+3

In generale, se si utilizza ARC e gli IBOutlet sono deboli, tutto viene scaricato quando la vista viene scaricata. Ma senza ARC e con gli IBOutlet forti (conservati) (ad esempio se li aggiungi e li rimuovi dinamicamente dalla vista), devi rilasciarli all'interno di viewDidUnload. Tuttavia, vuoi rilasciarli anche nel tuo metodo dealloc. Per rimuovere la duplicazione del codice, basta chiamare viewDidUnload da dealloc. Dovresti inserirlo sempre perché non viene chiamato automaticamente quando viene rilasciato il controller di visualizzazione. – Sulthan

Problemi correlati