Il protocollo NSObject viene fornito con i modelli di protocollo stock, ma non sembra essere tutto ciò che è necessario per le effettive implementazioni del protocollo. Lasciando perdere sembra assolutamente nulla. Quindi, è davvero necessario che un protocollo erediti da esso, o è solo un componente aggiuntivo non necessario?devono essere conformi al protocollo NSObject?
risposta
Per anni ho (e molti come me) non ha reso i nostri protocolli conformi allo <NSObject>
. Funziona bene. Ma può spesso essere fastidioso. Il disturbo più comune è che non è possibile utilizzare respondsToSelector:
senza eseguire il cast back allo NSObject*
(che tipo di sconfigge l'intero punto di un protocollo). Questo non importava ai giorni dell'ObjC1 perché non c'era lo @optional
, quindi nessuno di noi si preoccupava (non usavamo molto i protocolli in quei giorni perché senza lo @optional
non erano così utili). Quindi ObjC2 è arrivato con la meravigliosa aggiunta di metodi opzionali e all'improvviso respondsToSelector:
importava. Ci è voluto un po 'di tempo per rallentarci, ma alla fine abbiamo iniziato a capire che la vita era molto più semplice se rendi i tuoi protocolli conformi allo <NSObject>
. In modo intelligente questo ha fatto la sua strada in Xcode, rendendo più facile per tutti fare le cose nel modo più conveniente.
Ma no, non devi farlo. Non importa in molti casi. Ma non c'è molta ragione per non farlo, quindi lo consiglio.
Non necessariamente. Un delegato è solo un oggetto helper: gli unici requisiti sono quelli che la classe di delega colloca su di esso. Se si desidera formalizzare i requisiti per un determinato delegato, creare un protocollo formale, ovvero dichiarare un protocollo utilizzando la direttiva @protocol
. Se conforme al protocollo NSObject è uno di quei requisiti, è possibile rendere il vostro protocollo di adottarlo:
@protocol MyDelegateProtocol <NSObject>
//...
@end
Detto questo, non vedo alcuna ragione per creare un delegato che non è derivato da NSObject o forse NSProxy, e entrambe queste classi sono già conformi al protocollo NSObject.
Un delegato derivato da NSObject si interrompe se il protocollo non è conforme a NSObject? (in altre parole, non si conforma in generale a causa dei metodi delegati da non chiamare)? – CodaFi
Poiché NSObject è conforme al protocollo NSObject, qualsiasi classe derivata da NSObject è conforme anche al protocollo NSObject. Quindi no, un delegato derivato da NSObject non si interromperà solo perché il protocollo delegato che adotta non adotta esplicitamente il protocollo NSObject. – Caleb
Non tutti gli oggetti devono sottoclasse NSObject
quindi suppongo che se si aspettasse che un tale oggetto sia conforme al protocollo, non dovrebbe necessariamente essere conforme a NSObject.
Conforme a NSObject facciamo sapere al compilatore che l'oggetto è conforme alle nozioni di base: verificarlo NSObject Protocol Reference. Senza dire che sono conforme a NSObject come fa il compilatore a sapere che sono conforme a tutto ciò?
NSObject
è definito come
@interface NSObject <NSObject> {
Class isa;
}
mentre id
è definito come
typedef struct objc_object {
Class isa;
} *id;
Così per id
il compilatore non sa è conforme alla NSObject
Consiglia e non obbligatorio.
Secondo il documento ufficiale di Apple ProgrammingWithObjectiveC.pdf
Se si tenta di chiamare il metodo
respondsToSelector:
su un id conforme al protocollo come è definito sopra, si otterrà un errore di compilazione che non esiste un metodo di istanza noto per questo.Una volta che si qualifica un ID con un protocollo, il controllo di tipo allstatico ritorna; riceverai un errore se tenti di chiamare qualsiasi metodo che non è definito nel protocollo specificato . Un modo per evitare l'errore del compilatore è impostare il protocollo personalizzato per adottare il protocollo NSObject.
protocollo come è definito sopra è un protocollo senza conformarsi NSObject
protocollo.
A titolo di esempio, è buona norma definire i protocolli di conformarsi al protocollo NSObject (alcuni dei comportamenti NSObject è divisa dal sua interfaccia classe in un protocollo separato, la classe NSObject adotta la Protocollo NSObject).
- 1. Come elencare tutte le classi conformi al protocollo in Swift?
- 2. Perchè virare un protocollo di NSObject ad un'implementazione del protocollo
- 3. Le app per dispositivi mobili devono essere conformi alla normativa sui cookie dell'UE?
- 4. Come definire una matrice di oggetti conformi a un protocollo?
- 5. Le istanze dell'oggetto modello django devono essere passate al sedano?
- 6. Fitness- I test devono essere comunicati al database?
- 7. Dove devono essere definiti Meteor.methods()?
- 8. Swift: classe Instantiate (AnyClass) conforme al protocollo
- 9. Qual è lo scopo del metodo self nelle classi conformi a NSObject?
- 10. La classe swift è conforme al protocollo dell'obiettivo c che definisce le proprietà
- 11. Perché è importante essere conformi al profilo di base WS-I?
- 12. Soggetti RX: devono essere evitati?
- 13. Quali PEP devono essere letti?
- 14. Non conforme al protocollo 'NSCoding' - Swift 3
- 15. Come si aggiungono tipi diversi conformi a un protocollo con un tipo associato a una raccolta?
- 16. Swift: non è conforme al protocollo NSCoding
- 17. - [NSObject autoContentAccessingProxy] funziona?
- 18. Perché un messaggio SOAP devono essere inviati tramite HTTP?
- 19. Regex - I trattini devono essere sfuggiti?
- 20. Rendere classe conforme al protocollo con categoria per metodi esistenti
- 21. Impossibile creare una matrice di tipi conformi ad un protocollo a Swift
- 22. Quando devono essere inizializzate le classi - al momento del caricamento o al primo utilizzo?
- 23. Gli ETAG HTTP devono essere case sensitive?
- 24. Impossibile chiamare il metodo type sulla classe conforme al protocollo
- 25. Perché i metodi parziali devono essere annullati?
- 26. Le unità di misura devono essere localizzate?
- 27. Estensione rapida conforme al protocollo
- 28. In Swift come posso filtrare una matrice di oggetti conformi a un protocollo dalla loro classe?
- 29. Fare una classe Swift conformi ad un protocollo che richiede un init
- 30. protocollo di estensione, non è conforme al protocollo
Ottima risposta ... Ma anche il fastidio che si menziona con il protocollo NSObject entrerebbe in gioco solo con 'id obj', perché se si fa riferimento all'oggetto con una classe, il compilatore conoscerà l'ereditarietà ... presumibilmente inizia con NSObject ... –