2016-04-22 7 views
0

Jeder helfen Sie mir bitte die String-Vergleichstechnik in Objective-CComaparing NSString in Objective C

NSString *strNew1 = @"AA"; 
NSString *strNew2 = @"AA"; 

So zu verstehen, die Saiten vergleichen wir beide,

Method 1. if (strNew1 == strNew2) { 
      NSLog(@"Equal"); 
     } 

oder

nutzen könnten
Method 2: if ([strNew1 isEqualToString:strNew2]) { 
      NSLog(@"Equal"); 
     } 

In diesem Zustand sind beide erfolgreich. Aber ich bin mir bewusst, dass Methode 1 bei bestimmten anderen Bedingungen fehlschlägt. Und ich habe auch die folgenden Bedingungen ausprobiert (Alle sind Erfolg).

NSString *strNew = @"AA"; 
NSString *strNew1 = @"AA"; 
NSString *strNew11 = [[NSString alloc] initWithString:strNew1]; 
NSString *strNew3 = strNew; 
NSArray *arr = @[@"AA"]; 
NSString *strNew4 = [arr objectAtIndex:0]; 
NSString *strNew5 = [arr objectAtIndex:0]; 
_test = strNew5; 
_test1 = @"AA"; 
if ([strNew isEqualToString:strNew1]) { 
    NSLog(@"Equal"); 
} 

if (strNew == strNew3) { 
    NSLog(@"Equal1"); 
} 

if (strNew == [arr objectAtIndex:0]){ 
    NSLog(@"Equal2"); 
} 

if (strNew == strNew4){ 
    NSLog(@"Equal3"); 
} 

if (strNew5 == strNew4){ 
    NSLog(@"Equal4"); 
} 

if (strNew4 == [arr objectAtIndex:0]){ 
    NSLog(@"Equal5"); 
} 

if (strNew11 == [arr objectAtIndex:0]){ 
    NSLog(@"Equal11"); 
} 

if (self.test == strNew4){ 
    NSLog(@"Equal3"); 
} 

if (self.test == self.test1){ 
    NSLog(@"Equal3"); 
} 

TEST *test = [TEST new]; // Tried with a class with NSString property with value "AA" . (test.strTest value is @"AA") 
if (strNew == test.strTest) { 
    NSLog(@"Equal"); //success 
} 

Ich wusste, die meisten von ihnen redundant sind. Ich bin nicht in der Lage, die Grundlagen dahinter zu verstehen. Bitte erläutern Sie das Konzept dahinter klar. Vielen Dank.

+0

http: // Stapelüberlauf.com/questions/14036604/objective-c-nsobject-isequal-vs-Vergleich –

+5

Verwenden Sie die -isEqualToString: -Methode, um den Wert von zwei Zeichenfolgen zu vergleichen. Mit dem Operator C == werden einfach die Adressen der Objekte verglichen. –

Antwort

2

In den von Ihnen definierten Fällen werden die erstellten Strings intern als String-Literale behandelt. Die Laufzeit wird diesen Zeichenfolgen keinen unterschiedlichen Speicherplatz zuweisen.

Im Wesentlichen werden alle Zeichenfolgen, die das gleiche Zeichenfolgenliteral ("AA" in Ihrem Fall) enthalten, auf den gleichen Speicherort verweisen. Dies geschieht als Teil der Speicheroptimierung von Apple.

Wenn Sie den Wert einer beliebigen Zeichenfolge ändern (sagen wir zu "AB"), wird diesem NSString-Objekt eine neue Adresse zugewiesen, und dann schlägt == fehl.

1

Sie müssen unter Instanzmethode NSString Klasse verwenden.

- (BOOL)isEqualToString:(NSString *)aString; 

In Ihrem Fall also einfach unten folgen:

if ([strNew isEqualToString strNew4]){ 
    NSLog(@"Equal3"); 
} 

von (strNew == strNew4) tun,

Sie nur die Adressen der Objekte zu vergleichen.

1

Der erste Weg vergleicht Zeiger, während der zweite Weg Objekte vergleicht.

Das heißt, der erste Weg vergleicht, wenn die Zeiger den gleichen Wert haben. In diesem Fall ist es wahrscheinlich, dass sie dies nicht tun, im zweiten Fall werden die Objekte verglichen. Da sie auf die gleiche Weise initialisiert werden, könnten sie gleich sein. (Beachten Sie, dass mit der UIButton-Implementierung von isEqual angezeigt wird: das Ergebnis ist immer falsch.)

In den meisten Fällen verwenden Sie == nicht, was Sie wollen. Was jedoch angemessen ist, hängt von Ihrem Ziel ab.

if (strNew1 == strNew2) //This compared your pointers 
    { 

    } 

und

if ([strNew1 isEqualToString:strNew2]) //Compares NSString object 
    { 

    } 
0

Denken Sie daran, dass isEqualToString: mit einer Warnung kommt

[string1 isEqualToString: string2]

effektiv return false ist beide Strings gleich Null sind.