为什么NSString有时会使用等号?

chi*_*uba 1 string identity equality objective-c nsstring

可能重复:
了解Objective-C中的NSString比较

刚刚读到关于平等与身份的关系,我意识到在比较我的objc代码中的字符串时,我一直在使用一些相同的符号.奇怪的是,它实际上是时不时地工作,我想知道为什么.

http://www.karlkraft.com/index.php/2008/01/07/equality-vs-identity/

我有两段代码,一个是工作,一个不是.

工作.这里我有一个名为'Category'的对象,它有一个名为'name'的NSString属性.

@property (nonatomic, retain) NSString *name;
Run Code Online (Sandbox Code Playgroud)

然后我有一个函数,我传入一个'Catergory'指针,当我在这里使用等号时,它完美地工作.

 -(void)addCategoryToStorage:(Category*)newcategory {
      if(newcategory.name != @"All") {  // this works
Run Code Online (Sandbox Code Playgroud)

不工作.这里我使用NSFileManager调用的输出;

NSArray *dirContent = [self.fileManager 
                       contentsOfDirectoryAtPath:@"MyFiles"
                       error:nil];
Run Code Online (Sandbox Code Playgroud)

然后我尝试比较数组中的NSStrings:

for(int i = 0; i < [dirContent count]; i++) { 
    if([dirContent objectAtIndex:i] == @"MyFile") // This will never be True
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这两个NSString指针的工作方式有何不同?我知道我不应该使用"=="但此刻,但我很好奇为什么它有时会起作用.

我注意到他们调试之间有些区别.在第一种情况下,"newcategory"的"名称"表示(__ NSCFConstantString*)并且值可见.由于某种原因,"dirContent"数组包含两个(__NSString*)对象,其中值不可见.

这提出了另一个问题.是什么让NSString在第一种情况下变成常量?当我将它传递给函数时,它似乎与它的创建方式有关.当我分配一个具有NSString属性的新对象然后我传入一个函数时,该函数将其视为一个常量(对象的NSString属性).但是当对象存储在列表中并通过将[array objectAtIndex:index]传递给函数来获取它时,函数不会将其作为常量(对象的NSString属性)获取.

谢谢!

mvd*_*vds 5

当指针指向同一个对象时,它可能会起作用.

如果代码中有字符串文字,则它实际上是静态分配的类型对象NSString.在代码中的任何一点,如果你要引用这个字符串值,你实际上使用的是同一个指针.(指针基本上是一个内存地址)

如果@"abc"在代码中有多个字符串文字,则编译器只放入一个实例,并使用指向此单个实例的指针.

这解释了原因@"abc" == @"abc".

举个例子:

if(newcategory.name != @"All")
Run Code Online (Sandbox Code Playgroud)

只有在您的代码中的某个时刻才会起作用:

newcategory.name = @"All";
Run Code Online (Sandbox Code Playgroud)

如果您这样做,将无法工作:

newcategory.name = [NSString stringWithFormat:@"%c%c%c",'A','l','l'];
Run Code Online (Sandbox Code Playgroud)

因为在最后一种情况下,您显式分配了一个新字符串.

编辑刚测试,这个例子是有缺陷的:

newcategory.name = [NSString stringWithString:@"All"];
Run Code Online (Sandbox Code Playgroud)

因为这是优化的,所以你有相同的指针@"All"

  • 技术术语是*string interning*. (3认同)