我试图理解Objective-C中的取消引用,并在下面写了两种方法。
-(void)alterStringModelOne:(NSMutableString**)string{
NSMutableString *str = [NSMutableString stringWithString:@"New string by string = &str"];
string = &str; //Didn't work
}
-(void)alterStringModelTwo:(NSMutableString**)string{
NSMutableString *str = [NSMutableString stringWithString:@"New string by *string = str"];
*string = str; //It works
}
在上面,ModelOne不起作用,而ModelTwo可以。这两种说法有何不同?
编辑:跟踪其地址和类型
myStr = b260 类型 * CFString
---> 进入方法模型一
字符串 = 类型为 ** NSMutableString//参数的 d9c4
str = f750 的 * CFString//str 创建后
字符串 = 类型为 ** NSMutableString 的 d97c//赋值后:字符串 = &str;
-->方法返回
myStr = b260 * CFString
--> 进入方法模型二
字符串 = 类型为 ** NSMutableString//参数的 d9c4
str = 0bc0 of * CFString//str 创建后
字符串 = 0bc0 类型为 * CFString//赋值后: *字符串 = str;
-->叶法
myStr = 0bc0 类型 * CFString
首先:这不是特定于 Objective-C 的。C 和 C++ 中存在相同的行为。
string = &str;
这将修改局部变量 string
的值。
*string = str;
这将修改 string
指向的值。
由于string
是一个局部变量,因此更改它(如第一个示例所示)不会产生任何持久效果。但是,它指向的值不是本地的,因此更改该值(第二个示例)确实可以执行您想要的操作。
它的工作原理就像在 C 中一样。 Objective-C 对象由指针访问,因此:
NSMutableString *string;
string
被声明为指向对象结构的指针,您可以正常使用它,就好像它是直接的对象一样。然后你传递了该指针的地址,我们将其视为对象本身。像这样:
(NSMutableString **)string
其实是
((object)*)string
如果要为原始对象分配某些内容,则必须使用此string
指针指向的值,而不是其自身(就像在模型一中发生的那样),否则最终会修改它指向的内容,而不是其地址所表示的内容。这就是您的第二个模型起作用的原因。您将 str
放在原始指针上,原始指针是指向string
指针指向的所谓对象,这是一个指向对象的指针。
执行此操作时,请小心内存管理。