Domanda

Ho una classe che avvolge un oggetto NSMutableSet, e non ho un metodo di istanza che aggiunge oggetti (utilizzando il metodo addObject:) al NSMutableSet.

Questo funziona bene, ma sto profumo di un intoppo prestazioni in quanto all'interno del metodo sto chiamando esplicitamente containsObject: prima di aggiungere l'oggetto al set.

domanda parte tre:

  1. Devo essere chiamata containsObject: prima di aggiungere un oggetto del set?
  2. Se è così, quale metodo effettivo dovrei usare, containsObject o containsObjectIdenticalTo:?
  3. Se non è così, quale metodo contains viene invocata sotto il cofano della addObject:? Questo è importante per me, perché se mi passa un oggetto per containsObject: sarebbe tornare vero, ma se lo passo a containsObjectIdenticalTo: sarebbe return false.
È stato utile?

Soluzione

Se si sta avvolgendo un NSMutableSet, poi invocando containsObject: non è necessaria, dal momento che un insieme ( da definizione ) non contiene i duplicati. In quanto tale, se si tenta di inserire un oggetto che è già nel set, non accadrà nulla.

Per quanto riguarda un calo di prestazioni va, non ti preoccupare meno che effettivamente misurare che sia un problema. Sarei molto molto molto sorpreso se anche potesse, perché un insieme (almeno, una smart attuazione di una serie) ha O (1) lookup tempo (caso medio). Vi garantisco che NSSet e gli amici sono intelligenti implementazioni. :)

Da quello che ho raccolto circa l'attuazione del NSSet, è invocando -hash sugli oggetti come un modo per "gruppo" li in bidoni se si utilizza containsObject: o addObject:. Se si utilizza containsObjectIdenticalTo:, sarà ancora utilizzare -hash per restringere il processo di ricerca, e quindi (sostanzialmente) fare confronti di puntatore per trovare l'oggetto identico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top