是,硬編碼NSString的(字符串)中(即在源代碼中的任何@"..."
)被轉換成了無限期地存在,而你的進程正在運行的字符串。
然而的NSArray的containsObject:
方法調用isEqual:
它的對象,因此甚至是動態創建的字符串如[NSString stringWithFormat:@"%d", 2]
會在你的示例代碼段返回YES
。
這是因爲的NSString的isEqual:
(或更精確地其isEqualToString:
)方法被實現爲內容感知(相對於比較指針身份)從而對任何一對含有字符的非常相同的序列串的返回YES
(在時間比較),無論他們如何以及何時創建。
要檢查你不得不枚舉陣列,並且通過
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(你很可能不會想,雖然)比較相等(指針 - )身份。
或者以更方便的方式:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(你很可能不希望這樣一個其一)。
總結:
所以你從containsObject:
得到肯定答覆的原因是不因爲文字串,因爲containsObject:
通過公約要求isEqual:
共享同一個恆定的情況下,但 ,這是內容意識。
您可能想要從NSObject protocol中閱讀isEqual:
的(簡短)文檔。