NSString: isEqual frente a isEqualToString

94

¿Cuál es la diferencia entre isEqual:y isEqualToString:?

¿Por qué las clases agregan métodos isEqualTo * (isEqualToArray para NSArray, isEqualToData para NSData, ...) en lugar de simplemente anular isEqual:?

Jaka Jančar
fuente

Respuestas:

103

isEqual:compara una cadena con un objeto y devolverá NOsi el objeto no es una cadena. isEqualToString:es más rápido si sabe que ambos objetos son cadenas, como dice la documentación :

Consideraciones Especiales

Cuando sabe que ambos objetos son cadenas, este método es una forma más rápida de verificar la igualdad que isEqual:.

isEqualTo<Class>se utiliza para proporcionar controles específicos de igualdad. Por ejemplo; isEqualToArray:comprueba que las matrices contienen un número igual de objetos y que los objetos en un índice dado regresan YESpara la isEqual:prueba.

Abizern
fuente
3
Si cree en Aaron Hillegass, entonces no hay diferencia de rendimiento, solo un poco de seguridad: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro
2
Gracias por el enlace, útil. Aunque nos estás pidiendo que le creamos a Mark Dalrymple, a quien hago :)
Abizern
16

Además, para escribir sus propios métodos -isEqual:y -isEqualTo<Class>:, la convención es permitir argumentos nulos -isEqual:y generar una excepción para argumentos nulos para-isEqualTo<Class>:

Jonathan Dann
fuente
1
No me había encontrado con esto antes, ¿alguna documentación que conozca?
Mike Abdullah
2
Esto no parece ser cierto para isEqualToString, que simplemente devuelve NO si pasa nil.
Jaka Jančar
9
Interesante, está documentado en la sección de comparación de objetos de la <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Guía de fundamentos</a>
Jonathan Dann
Esto no es verdad. isEqualToString no genera una excepción.
respectTheCode
1
La página web de Cocoa Fundamentals Guide dice: "Este documento puede no representar las mejores prácticas para el desarrollo actual". Es viejo, aparentemente.
cbh2000
5

Mi conjetura es que proporciona una ligera mejora en el rendimiento, como isEqualToString: no tendrá que escribir-cheque lo que pasó en.

iKenndac
fuente
Tu conjetura es probablemente cierta :)
Philip007
5

Ampliando las respuestas de @Abizern y @Jonathan Dann, ambos isEqualy isEqualToStringtrabajar con nilvalores.

- (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");
}
respectTheCode
fuente
4

Recomiendo altamente este . Los beneficios de rendimiento de isEqualToString son básicamente insignificantes para la mayoría de las aplicaciones. Pero hay otras dos distinciones que menciona el autor:

  • Tipo de seguridad
  • El camino nilse maneja
Ben Packard
fuente
No veo ninguna diferencia en la forma en que los dos manejan nil. Sea nulo el receptor o el argumento o ambos.
SayeedHussain
Sea lo que sea "esto" ya no existe: /
Jared Grubb
1
Gracias @JaredGrubb, encontré la nueva URL.
Ben Packard