이유 ==
일 때문에 포인터 비교입니다. 를 사용하여 상수 NSString
를 정의 @""
하면 컴파일러가 참조를 고유하게 만듭니다. 동일한 상수가 코드의 다른 위치에 정의되면 모두 메모리의 동일한 실제 위치를 가리 킵니다.
NSString
인스턴스를 비교할 때 다음 isEqualToString:
방법을 사용해야합니다 .
NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%d", (myString2 == myString3))
NSLog(@"%d", (myString1 == myString2));
NSLog(@"%d", [myString1 isEqualToString:myString2]);
NSLog(@"%d", [myString1 isEqualToString:myString3]);
[myString3 release];
편집하다:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
더 이상 새 참조를 만들지 않습니다. initWithFormat
,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3
상수에 대한 포인터 도 만들"foo"
것이므로 일반적으로 이러한 세 가지 변수는 모두 동일한 메모리 위치를 가리 킵니다. 이는 gcc 및 clang 모두에 해당됩니다 (기본 옵션 사용). 이 컴파일 시도 gist.github.com/578568