2013-04-09 13 views
12

Sto lavorando con la programmazione dei socket. Volevo solo chiarire un dubbio relativo a un codice che ho scaricato da - mobileorchard.com - Chatty. Mentre R & D, ho visto una chiamata di funzione in ChatRoomViewController.m file diPerché chiamiamo doesNotRecognizeSelector: method?

[chatRoom broadcastChatMessage:input.text fromUser:[AppConfig getInstance].name]; 

quando ho visto in Room.m file di, per l'attuazione del bando di cui sopra; era

- (void)broadcastChatMessage:(NSString*)message fromUser:(NSString*)name 
{ 
    // Crude way to emulate an "abstract" class 
    [self doesNotRecognizeSelector:_cmd]; 
} 

i googled per "doesNotRecognizeSelector:", secondo Apple relativo per la gestione degli errori, affermando "Il sistema runtime richiama questo metodo ogni volta che un oggetto riceve un messaggio aSelector non può rispondere o avanti" la mia domanda è: perché lo sviluppatore chiama la funzione broadcastChatMessage: fromUser: se non ne fa uso e per gestire l'eccezione del "selettore non trovato" del metodo?

Secondo Stackovrflow, è utilizzato per creare una classe astratta, in base a questo Question, per evitare l'avviso di "Incompleto incompleto".

Non riesco ancora a capire perché questo metodo sia utilizzato in quello Chatty Code, Gentilmente aiutami a capire il motivo per cui viene usato quel metodo.

+1

Sembra che lo sviluppatore originale dell'applicazione stia tentando di emulare le funzionalità di una classe di base astratta C++, in quanto non valide. È semplicemente una forma più estrema di rendere i metodi non fare nulla o restituire un valore di segnaposto (di solito 0 o NULL). – CodaFi

risposta

11

Questo è il metodo esistente su ogni oggetto derivato NSObject che attiva il percorso di un'eccezione quando un metodo non viene riconosciuto in una chiamata di runtime. Ad esempio, se si tenta di inviare un messaggio a NSString chiamato -foo, finirà lì perché non è un metodo valido su NSString.

In questo caso, la classe Chatty Room è una classe base che non viene mai utilizzata direttamente. LocalRoom e RemoteRoom derivano da esso e entrambe le classi forniscono un'implementazione preponderante di -broadcastChatMessage:fromUser. Nessuno chiama mai la versione della classe base, ma per "completezza" il programmatore ha garantito che un subclasser deve scavalcare questo implementando il metodo, ma poi girarsi e chiamarlo per attivare un'eccezione.

Questo è, questo non è specificamente idiomatico Objective-C. Una classe "astratta" è un concetto del C++ e di altri linguaggi; è una classe base che esiste solo come "pattern" da cui sottoclasse. (In ObjC, questo è spesso fatto creando uno @protocol formale quando non c'è stato significativo, dato che lì (principalmente) non è qui).

Si noti che la chiamata a -doesNotRecognizeSelector: è arbitraria. Qui non è necessario evitare gli avvertimenti del compilatore (poiché il metodo è in effetti implementato) e lo scrittore originale potrebbe facilmente generare un'eccezione direttamente o non fare nulla.

4

Mi sembra che abbiate già risposto alla sua stessa domanda. Non esiste un metodo per creare classi astratte in Objective-C, quindi la cosa più vicina da fare per avere i metodi necessari per sovrascrivere genera eccezioni. Se si sostituisce questo metodo in una sottoclasse, non sarà più chiamato doesNotRecognizeSelector:. Fondamentalmente è un modo per convincere uno sviluppatore a promettere di implementare questo metodo nella loro sottoclasse.

Inoltre, come hai detto, se non lo inserisci, il compilatore emetterà un avviso perché non esiste alcuna implementazione per un metodo definito nell'intestazione. Questo eseguirà lo stesso comportamento di non implementarlo, ma il compilatore si renderà conto che lo stai facendo apposta.