Vâng, NSStrings mã hóa cứng (xâu) (có nghĩa là bất kỳ @"..."
trong mã nguồn của bạn) đều được biến thành chuỗi đang tồn tại vô thời hạn trong khi quá trình bạn đang chạy.
Tuy nhiên NSArray 's containsObject:
phương pháp gọi isEqual:
trên các đối tượng của nó, do đó thậm chí là một chuỗi động tạo như [NSString stringWithFormat:@"%d", 2]
sẽ trở YES
trong đoạn mẫu của bạn.
Điều này là do NSString của isEqual:
(hay chính xác hơn isEqualToString:
của nó) phương pháp được thực hiện để được nội dung nhận thức (so với so sánh bản sắc con trỏ) và do đó trả về YES
cho bất kỳ cặp chuỗi có chứa chuỗi rất giống nhau của các nhân vật (tại thời điểm so sánh), bất kể chúng được tạo ra như thế nào và khi nào.
Để kiểm tra các bằng (pointer-) danh tính bạn phải liệt kê mảng của bạn và so sánh qua
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(mà nhiều khả năng bạn sẽ không muốn, mặc dù).
Hoặc một cách thuận tiện hơn:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(nhiều khả năng bạn sẽ không muốn điều này một trong hai).
Tổng hợp:
Vì vậy, lý do bạn nhận được một câu trả lời tích cực từ containsObject:
là KHÔNG vì chuỗi chữ chia sẻ các trường hợp liên tục cùng, NHƯNG vì containsObject:
theo quy ước gọi isEqual:
, đó là nội dung nhận thức được.
Bạn có thể muốn đọc tài liệu (ngắn) cho isEqual:
từ NSObject protocol.