2012-03-17 12 views
28

Ho appena convertito un vecchio progetto in ARC utilizzando il refactoring automatico di Xcode.Dopo la conversione Auto-ARC: assegnazione di un oggetto mantenuto a una proprietà non sicura; l'oggetto verrà rilasciato dopo l'assegnazione

@property (nonatomic, retain) NSMutableArray *cards; 

è stato sostituito da:

@property (nonatomic) NSMutableArray *cards; 

Ciò ha senso perché quello che ho letto è che "forte" è lo stato di default. Tuttavia, la seguente riga mi sta dando l'errore nel titolo:

self.cards = [[NSMutableArray alloc] initWithCapacity:54]; 

L'errore viene risolto con l'aggiunta strong indietro nel cui conservano usato per essere:

@property (nonatomic, strong) NSMutableArray *cards; 

Comunque ... se ho bisogno per tornare indietro e inserire strong in ogni dichiarazione @property che era retain ... perché il refactoring ARC li ha rimossi tutti?

+0

In realtà, la semantica di gestione della memoria predefinita è 'assign', non' strong', motivo per cui si sta ricevendo il messaggio di avviso. – jlehr

+5

jlehr non ha ragione riguardo la semantica di gestione della memoria predefinita. ma non ha torto neanche prima di LLVM 3.1 e ARC l'impostazione predefinita è stata assegnata. ma al giorno d'oggi è forte. questo purtroppo è molto scarsamente documentato. vedi la risposta di nschum. – stigi

+1

Ora che il valore predefinito è elevato, l'avviso dovrebbe essere sparito. Perché non è così? –

risposta

42

Ho eseguito lo stesso avviso e aperto un Incidente di supporto tecnico. L'ingegnere ha verificato che il valore predefinito è stato modificato da "assegna" a "forte" per motivi di coerenza all'interno di ARC.

Ha detto che sia l'avviso che la documentazione sono errati e verranno riparati. Finché ciò non sarà fatto, vorrei evitare il default implicito del tutto!

Aggiunta esplicita di "strong" (come suggerito da BJ Homer) è un modo sicuro per disattivare l'avviso ed essere compatibile. Ma non assumere che le proprietà siano non mantenute per impostazione predefinita. Metti sempre "debole" o "assegna" anche lì.

Modifica: lo clang documentation ora documenta ufficialmente questa modifica. L'avviso è stato fixed.

Modifica 2: Xcode 4.4 apparentemente include la correzione.

+0

Quindi l'avviso è stato corretto. Quando vedremo questa correzione in xcode? –

+1

@nschum questo avviso si verifica ancora nell'ultima versione di Xcode 4.3.3. perché? –

+0

Sfortunatamente, il commit collegato era per * trunk * di LLVM. Quindi non mi aspetto necessariamente che la correzione venga visualizzata in una versione di manutenzione. Non ho provato Xcode 4.4. – nschum

8

Sembra errato che abbia convertito nonatomic, retain in nonatomic. L'ho sempre visto convertire in nonatomic, strong. Se riesci a produrre un semplice progetto che si converte nel modo in cui l'hai visto, ti suggerisco di usare lo filing a radar.

Presumo dal modo in cui si utilizza l'ultimo Xcode.

+0

Sto usando 4.3.1 che ho scaricato dall'App Store ieri, quindi è meglio che sia il più recente. :) –

+2

Sì, questo è, sfortunatamente, un bug noto in 4.3.1. L'ho segnalato io stesso l'altro giorno. La soluzione più semplice consiste semplicemente nel fare un regex di progetto sostitutivo di 'retain (, | \))' con 'strong \ 1'. Quindi eseguire nuovamente la conversione ARC. –

+1

Definite sicuramente un radar quindi @KennyWyland – mattjgalloway

Problemi correlati