【发布时间】:2012-02-06 00:04:24
【问题描述】:
刚刚阅读有关平等与身份的内容,我意识到在比较我的 objc 代码中的字符串时,我一直在使用一些等号。奇怪的是它实际上有时会起作用,我想知道为什么。
http://www.karlkraft.com/index.php/2008/01/07/equality-vs-identity/
我有两段代码,一段有效,另一段无效。
工作。在这里,我有一个名为“Category”的对象,它有一个名为“name”的 NSString 属性。
@property (nonatomic, retain) NSString *name;
然后我有一个函数,我在其中传递一个“类别”指针,当我在这里使用等号时,它工作得很好。
-(void)addCategoryToStorage:(Category*)newcategory {
if(newcategory.name != @"All") { // this works
不工作。这里我使用 NSFileManager 调用的输出;
NSArray *dirContent = [self.fileManager
contentsOfDirectoryAtPath:@"MyFiles"
error:nil];
然后我尝试比较数组中的 NSStrings:
for(int i = 0; i < [dirContent count]; i++) {
if([dirContent objectAtIndex:i] == @"MyFile") // This will never be True
所以我的问题是,这两个 NSString 指针工作方式如此不同的原因是什么?我知道我不应该使用“==”,但目前,但我很好奇为什么它有时会起作用。
我注意到它们在调试时有些不同。在第一种情况下,“newcategory”的“名称”表示 (__NSCFConstantString*) 并且值可见。 出于某种原因,“dirContent”数组包含两个 (__NSString*) 对象,其中的值不可见。
这引发了另一个问题。是什么让第一种情况下的 NSString 成为常量?当我将它传递给函数时,它似乎与它的创建方式有关。当我分配一个具有 NSString 属性的新对象,然后将其传递给函数时,该函数将其视为一个常量(对象的 NSString 属性)。但是,当对象存储在列表中并且我通过将 [array objectAtIndex:index] 传递给函数来获取它时,函数不会将其作为常量(即对象的 NSString 属性)来获取。
谢谢!
【问题讨论】:
标签: objective-c string nsstring identity equality