2011-08-06 218 views
18

在我的應用程序中有一個機制,要求在某個點上兩個NSString s將是相同的做某事;出於某種原因,當我比較兩者時,即使它們是相同的,它仍然不能識別這一點。該代碼是這樣的:比較兩個NSStrings

NSString * aString = [self someMethodThatGetsAString]; 

NSString * bString; 

BOOL areStringsTheSame = NO; 

while (areStringsTheSame != YES) { 

     bString = [self someMethodThatTakesNSStringsFromAnArrey]; 
     if (bString == aString) { 
      areStringsTheSame = YES; 
     { } 

我甚至插入一個NSLog()並確信在某一點他們是相同的(而據我所知,這是==代表什麼...),但仍然沒有進入if來更改BOOL值。

是否有另一種方法來做這種比較?我錯過了什麼嗎?

回答

72

您可以使用該方法isEqualToString:

if ([bString isEqualToString:aString]) 

==比較引用(地址的)的字符串,而不是字符串的值。

+2

真正。並深入研究OOP的原理(具有相同屬性的兩個對象不一定是相同的對象)。否則,你會在開發人員生活中每天遇到這個問題:-) – vstrien

+0

由於Objective-C使用字符串變量的方式,顯然'=='的工作原理同樣可以比較字符串的區分大小寫。例如,聲明一個字符串A和字符串B,並執行'==',你會發現它們都存儲在同一個地址中。 –

2

最近我對NSLog上兩個相似的NSStrings可能會有所不同而感到震驚。這是因爲有時NSString可以包含一個零寬度的空格字符。意識到這一點,並考慮:

#define ZERO_WIDTH_SPACE_STRING @"\u200B" 

要克服這一點,你應該清理從零個寬度的空白字符的字符串比較之前:

NSMutableString *eMailToAdd = [NSMutableString string]; 

NSMutableCharacterSet *charSet = [[NSCharacterSet whitespaceCharacterSet] mutableCopy]; 
    //[charSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; 

    NSString *rawStr = [[tokenField textField] text]; 
    for (int i = 0; i < [rawStr length]; i++) 
    { 
     if (![charSet characterIsMember:[rawStr characterAtIndex:i]]) 
     { 
      [eMailToAdd appendFormat:@"%@",[NSString stringWithFormat:@"%c", [rawStr characterAtIndex:i]]]; 
     } 
    } 
3

這種方式爲我工作:

if ([firstString compare:secondString] == NSOrderedSame) { 
    //Do something when they are the same 
} else { 
    //Do something when they are different 
}