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ố NSString
bằ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 NSString
trườ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"];
myString3
mộ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