6

devo svolgere un selettore per nome in una classe (non un esempio) e usare il suo valore di ritorno:"performSelector può causare una perdita" alternativa quando causa una perdita?

id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1]; 

Il selettore crea una nuova istanza della classe. Ho bisogno di usare l'istanza restituita. Ovviamente ottengo il solito performSelector potrebbe causare una perdita perché il suo selettore è sconosciuto avviso poiché questo progetto è stato compilato con ARC.

se ho capito bene (from the answers here e altri), in questo caso il performSelector sarà causare una perdita (mi corregga se sbaglio, quindi ho potuto solo disattivare l'avviso e da fare con esso). I selettori sono implementate come segue:

+ (id) objectWithFile:(NSString*)p1 
{ 
    return [NSKeyedUnarchiver unarchiveObjectWithFile:p1]; 
} 

Quali sono le opzioni quando devo usare il selettore da stringa e il selettore crea e restituisce una nuova istanza dell'oggetto?

Ho considerato NSInvocation ma il suo metodo getReturnValue mi richiede di fornire il mio buffer allocato in cui è memorizzato il valore di ritorno. Non sono sicuro che funzioni anche con ARC e metodi di classe, o se devo semplicemente convertire __bridge_transfer nel buffer del valore di ritorno di malloc su id e questo è tutto quello che c'è da fare.

+0

Non ho ancora capito perché si avrebbe una perdita nel tuo caso. 'objectWithFile:' restituisce un oggetto autoreleased perché non è un metodo alloc/copy/new. –

+0

Non sono sicuro di averlo capito correttamente. Dico che restituisco [Oggetto nuovo] al posto dell'oggetto non archiviato, che restituisce anche un oggetto autorelease ma che quindi verrebbe a mancare? Oppure la perdita ** si verifica ** solo se il selettore eseguito chiama alloc, new o copy? – LearnCocos2D

risposta

5

objectWithFile: non è un metodo della "alloc, copy, init, mutableCopy, e nuova famiglia" e quindi è un metodo "valori di ritorno non trattenuti", nel senso della "Clang/ARC documentation":

Un metodo o una funzione che restituisce un tipo di oggetto conservabile ma che non restituisce un valore mantenuto deve garantire che l'oggetto sia ancora valido attraverso il limite di ritorno.
...
Nel peggiore dei casi, questo può comportare un'autelease, ma i chiamanti devono non assumere che il valore sia effettivamente nel pool di autorelease.

Quindi, non importa quello che fai all'interno del metodo, il chiamante non deve rilasciare l'oggetto restituito .

Pertanto non penso che ci sia una perdita di memoria nel codice.

+0

Grazie, ha senso. Inoltre conferma la mia osservazione perché gli oggetti restituiti sono deallocati se non mantenuti con un forte riferimento. – LearnCocos2D