gpt4 book ai didi

objective-c - 对 NSString 不变性感到困惑

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:28 24 4
gpt4 key购买 nike

我是一个 Objective-C 新手。我正在为可变性/不变性这两个概念而苦苦挣扎。我正在阅读一本名为 Programming in Objective-C 第 4 版的书。第 15 章讨论了声明为不可变的 NSString 类。然后,该书提供了似乎与此相矛盾的示例,例如:

NSString *str1 = @"this is string A";
NSString *str2 = @"this is string B";

str2 = [str1 stringByAppendingString:str2];

NSString *res;

res = [str1 substringToIndex:3];
res = [str1 substringFromIndex:5];
res = [[str1 substringFromIndex:8]substringToIndex:6];
res = [str1 substringWithRange:NSMakeRange(8, 6)];

所以虽然'res'是一个指向不可变对象(immutable对象)的指针,但是它的值已经改变了好几次,这怎么能叫不可变呢?我想我完全忽略了这一点。任何建议,感激不尽。

最佳答案

在以下行中:

NSString *str2 = @"this is string B";
str2 = [str1 stringByAppendingString:str2];

您不更改字符串“this is string B”(存储在变量 str2 中)的内容,而是将变量设为 str2 指向不同的字符串(由 stringByAppendingString: 方法生成的 字符串)。

const char*char* const 之间的区别与 C 中的区别完全相同。

  • NSString*const char* 都表示指向内容不可更改的字符串(Cocoa 或 C)的指针。该变量仍然可以指向不同的字符串,但原始字符串不会更改其内容。
  • 这不同于指向字符串的常量指针,如 char* constNSMutableString* const,后者是指向可变字符串的常量指针,表示字符串本身可以更改,但变量/指针将始终指向内存中的相同地址。

研究这个例子:

NSString* str1 = @"A";
NSString* str2 = str1; // points to the same immutable string
NSString* str3 = [str1 stringByAppendingString:@"B"];
// Now str1 and str2 both point to the string "A" and str3 points to a new string "AB"
str2 = str3;
// Now str2 points to the same string as str3 (same memory address and all)
// So str1 points to string "A" and str2 and str3 both point to "B"

请注意,在该示例中,str1 没有更改,仍然是 “A”。它没有被变异。这与其他示例不同:

NSMutableString* str1 = [NSMutableString stringWithString:@"A"];
NSMutableString* str2 = str1; // points to the same mutable string
[str2 appendString:@"B"];
// Now str1 and str2 still both point to the same string, but
// this same string has been mutated and is now "AB"
// So the string that previously was "A" is now "AB" but is still as the same address in memory
// and both str1 and str2 points to this address so are BOTH equal to string "AB"

在第二个示例中,字符串发生了变化,因此指向该字符串的变量 str1str2 现在都包含“AB”。

关于objective-c - 对 NSString 不变性感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12977024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com