2009-08-18 11 views
88

Qual è la differenza tra isEqual: e isEqualToString:?NSString: isEqual vs. isEqualToString

Perché le classi aggiungono i metodi isEqualTo * (isEqualToArray per NSArray, isEqualToData per NSData, ...) invece di ignorare semplicemente isEqual:?

risposta

95

isEqual: confronta una stringa in un oggetto, e tornerà NO se il l'oggetto non è una stringa. isEqualToString: è più veloce se si conosce entrambi gli oggetti sono stringhe, come le documentation stati:

Considerazioni particolari

Quando si conosce entrambi gli oggetti sono stringhe, questo metodo è un modo più veloce per controllare l'uguaglianza di isEqual:.

isEqualTo<Class> viene utilizzato per fornire controlli specifici per l'uguaglianza. Per esempio; isEqualToArray: controlla che gli array contengano un numero uguale di oggetti e che gli oggetti in un determinato indice restituiscano YES per il test isEqual:.

+3

Se credi Aaron Hillegass quindi non v'è alcuna differenza di prestazioni , solo un po 'di tipo safty: http://blog.bignerdranch.com/334-isequal-vs-isequaltostring/ – Caro

+2

Grazie per il link - utile. Anche se ci stai chiedendo di credere a Mark Dalrymple - chi faccio io :) – Abizern

5

mio ipotesi è che fornisce un leggero miglioramento delle prestazioni, come isEqualToString:. Non dovrà digitare controllare cosa sta passato in

+0

La tua ipotesi è probabilmente vero :) – Philip007

14

Inoltre, per scrivere i propri -isEqual: e -isEqualTo<Class>: metodi, la convenzione è quello di permettere argomenti nil per -isEqual: e sollevare un'eccezione per argomenti zero a -isEqualTo<Class>:

+1

Non avevo mai visto prima questo, nessuna documentazione che tu sappia? –

+1

Questo non sembra essere vero per isEqualToString, che restituisce NO se passi in zero. –

+8

Interessante, è documentato nella sezione Confronto oggetti dello Cocoa Fundamentals Guide

4

Ampliando risposte @Abizern e @ Jonathan Dann, sia isEqual e isEqualToString funziona con i valori nil.

- (void)testStringEqual { 
    NSString *string = nil; 

    STAssertFalse([string isEqual:@"test"], @"NSString isEqual"); 
    STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString"); 

    // Note that these both return NO 
    STAssertFalse([string isEqual:nil], @"NSString isEqual"); 
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString"); 

    string = @"test"; 

    STAssertTrue([string isEqual:@"test"], @"NSString isEqual"); 
    STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString"); 

    STAssertFalse([string isEqual:nil], @"NSString isEqual"); 
    STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString"); 
} 
3

Consiglio vivamente this. I vantaggi prestazionali di isEqualToString sono sostanzialmente trascurabili per la maggior parte delle applicazioni. Ma ci sono altre due distinzioni l'autore cita:

  • di sicurezza di tipo
  • Il modo in cui viene gestita nil
+0

Non vedo alcuna differenza nel modo in cui nil è gestito da entrambi. Essere nil essere il ricevitore o argomento o entrambi. – SayeedHussain

Problemi correlati