2012-12-15 7 views
11

Ecco fatto. Perché qualcuno dovrebbe (almeno come API pubblica) un metodo come quello? C'è qualche uso pratico per questo?Qual è lo scopo del metodo self nelle classi conformi a NSObject?

+0

Beh, perché no ...? –

+1

La domanda era "Perché qualcuno dovrebbe volere ..." o "Qual è lo scopo ...", non "Perché è lì?" – Matoe

+1

Questa sembra una domanda valida. Perché i downvotes? –

risposta

12

Il metodo self è utile per la codifica dei valori-chiave (KVC).

Con KVC, è possibile trattare un oggetto in qualche modo come un dizionario. È possibile accedere a una proprietà dell'oggetto utilizzando una stringa contenente il nome della proprietà, ad esempio: [view valueForKey:@"superview"]. Si cammina lungo una catena di proprietà utilizzando una stringa contenente un percorso chiave, come questo: [view valueForKeyPath:@"superview.superview.center"].

Dal NSObject ha un metodo self, è possibile utilizzare self come il percorso della chiave o il tasto: [view valueForKey:@"self"]. Quindi, se stai costruendo i tuoi percorsi chiave a livello di programmazione, o leggendoli da un file, usando "self" come chiave potresti permetterti di evitare di scrivere un caso speciale.

È inoltre possibile utilizzare self in predicati, come questo:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self beginswith \"foo\""]; 
NSArray *filteredArray = [arrayOfStrings filteredArrayWithPredicate:predicate]; 

non so se NSPredicate in realtà utilizza il metodo self (forse tramite KVC) in questo caso. È certamente possibile.

+1

"SELF" è documentato come costante speciale in NSPredicates, come "nil", "NULL" e un mucchio di altri. Potrebbe essere mappato sull'effettivo metodo di "sé", ma per me la documentazione implica che è speciale. –

-1

Penso che abbia a che fare con il runtime ObjC.

objc_msgSend(autoreleasePool, sel_registerName("drain")); 
BOOL AppDel_didFinishLaunching(struct AppDel *self, SEL _cmd, void *application, void *options) 

Il primo argomento è self. Penso che abbia qualcosa a che fare con quello. In tutta onestà però come sarebbe finire come:

id self(struct id *self, SEL _cmd) { 
    return self; 
} 

.... aveva più senso prima che ho iniziato a scrivere questa risposta.

2

Non sono sicuro del motivo per cui "self" è stato aggiunto in origine, ma una cosa che è stata utile per proteggere i puntatori interni agli oggetti. La raccomandazione ufficiale di Apple era di inserire una chiamata [foo self] dopo aver finito con il puntatore interno; la chiamata al metodo non funziona in modo funzionale, ma assicura che il compilatore continui a giocare fino a quel momento.

Problemi correlati