2016-04-22 61 views
0

的任何一個,請幫助我瞭解字符串比較技術的Objective-CComaparing NSString的目標C

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

因此,要比較這兩個我們可以使用字符串,

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

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

在他們兩人的這個條件是成功的。但是我知道方法1在某些其他條件下會失敗。而且我也嘗試了以下條件(全部都是成功)。

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 
} 

我知道他們大多是多餘的。我無法理解這背後的基礎知識。請任何人都對此背後的概念作出明確的解釋。謝謝。

+0

http:// stackoverflow。com/questions/14036604/objective-c -nsobject-isequal-vs-comparison –

+5

使用-isEqualToString:方法比較兩個字符串的值。使用C ==操作符將簡單地比較對象的地址。 –

回答

2

在您定義的情況下,創建的字符串在內部被視爲字符串文字。運行時不會爲這些字符串分配不同的內存空間。

基本上所有包含(在你的情況下,「AA」)相同的字符串常量字符串將指向相同的內存位置。這是蘋果公司內存優化的一部分。

當您更改任何字符串的值(說「AB」)一個新的地址將被分配給的NSString對象,然後==將失敗。

1

您需要使用下面NSString類的實例方法。

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

所以,在你的情況簡單地遵循如下:

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

通過這樣做(strNew == strNew4)

你只比較對象的地址。

1

第一種方法比較指針,而第二種方法比較指針。

也就是說,第一種方法比較指針是否具有相同的值。在這種情況下,他們很可能不會在第二種情況下比較對象。因爲它們的初始化方式與它們可能相同。 (請注意,它看起來與UIButton的的的isEqual執行的:結果始終是假的。)

在使用==是不是你想要的大多數情況下。但是,什麼是適當的取決於你的目標。

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

    } 

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

    } 
0

記住isEqualToString:帶有一個警告

[字符串1 isEqualToString:字符串2]

將有效地返回false是兩個字符串爲零。