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.
Non ho ancora capito perché si avrebbe una perdita nel tuo caso. 'objectWithFile:' restituisce un oggetto autoreleased perché non è un metodo alloc/copy/new. –
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