Lý do tại sao ==hoạt động là vì so sánh con trỏ. Khi bạn xác định một hằng số NSStringbằng cách sử dụng @"", trình biên dịch thống nhất tham chiếu. Khi các hằng số giống nhau được xác định ở những vị trí khác trong mã của bạn, tất cả chúng sẽ trỏ đến cùng một vị trí thực tế trong bộ nhớ.
Khi so sánh các NSStringtrường hợp, bạn nên sử dụng isEqualToString:phương pháp:
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];
Biên tập:
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:không tạo tham chiếu mới nữa, bạn sẽ cần initWithFormat,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
myString3một con trỏ tới hằng số"foo"như một sự tối ưu hóa, vì vậy nói chung, cả ba biến này sẽ trỏ đến cùng một vị trí bộ nhớ. Điều này đúng cho cả gcc và clang (với các tùy chọn mặc định). Hãy thử biên dịch cái này: gist.github.com/578568