取消引用在 Objective-C 中的工作原理



我试图理解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指针指向的所谓对象,这是一个指向对象的指针。

执行此操作时,请小心内存管理。

相关内容

  • 没有找到相关文章

最新更新