Vorrei eseguire l'override di un metodo in una classe Objective C a cui non dispongo dell'origine.Utilizzo di Super in una categoria Objective C?
L'ho esaminato e sembra che le Categorie dovrebbero consentirmi di farlo, ma mi piacerebbe utilizzare il risultato del vecchio metodo nel mio nuovo metodo, usando super per ottenere il risultato dei vecchi metodi.
Ogni volta che provo questo, viene chiamato il mio metodo, ma "super" è nullo ... Qualche idea del perché? Sto facendo lo sviluppo di iPhone con l'SDK XCode 2.2. Sto sicuramente lavorando con un'istanza di una classe, e il metodo della classe è un metodo di istanza.
@implementation SampleClass (filePathResolver)
-(NSString*) fullPathFromRelativePath:(NSString*) relPath
{
NSString *result = [super fullPathFromRelativePath: relPath];
... do some stuff with the old result
return result;
}
Nota e chiarimenti: Da quello che posso vedere in Apple Docs, mi sembra che questo dovrebbe essere permesso?
Categories docs at developer.apple.com: Quando una categoria sostituisce un metodo ereditato, il metodo nella categoria può, come al solito, invocare la implementazione ereditato tramite un messaggio a super. Tuttavia, se una categoria sostituisce un metodo già esistente nella classe della categoria , lo non consente di richiamare l'implementazione originale .
Hai mai trovare una soluzione a questo? Sto provando a modificare il parametro di testo mentre viene passato nel setText: method di UILabel. Non voglio sottoclasse UILabel (enorme base di codice), quindi una categoria è probabilmente appropriata. Anche io penso che chiamare super setText farebbe il trucco, se il superoggetto fosse in realtà l'UILabel, ma poi, molto probabilmente porterebbe ad un ciclo infinito che chiama setText: definito nella categoria. Quindi è chiaro che questa è probabilmente un'impresa impossibile per una categoria. –
Ehi! Non ho mai trovato altre soluzioni oltre a quelle pubblicate su questa pagina. Usa il metodo swizzling, o un metodo diverso in una categoria ;-( –