4

我试图理解 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

---> 进入方法模型一

string = d9c4 of type ** NSMutableString //参数

str = f750 of * CFString //str创建后

string = d97c of type ** NSMutableString //赋值后:string = &str;

--> 方法返回

myStr = b260 * CFString

--> 进入方法模型二

string = d9c4 of type ** NSMutableString //参数

str = 0bc0 of * CFString //str创建后

string = 0bc0 of type * CFString //赋值后:*string = str;

--> 叶方法

myStr = 0bc0类型 * CFString

4

2 回答 2

4

首先:这不是特定于 Objective-C 的。C 和 C++ 中存在相同的行为。

string = &str;

这会修改局部变量的值string

*string = str;

这会修改 指向的值string

由于string是局部变量,因此更改它(如第一个示例所示)不会产生任何持久的影响。但是,它指向的值不是本地的,因此更改它(第二个示例)确实可以满足您的要求。

于 2013-01-24T01:07:39.887 回答
0

它的工作方式就像在 C 中一样。Objective-C 对象是通过指针访问的,所以在:

NSMutableString *string;

string被声明为指向对象结构的指针,您可以正常使用它,就好像它直接是对象一样。然后您传递了该指针的地址,我们将其视为对象本身。就像是:

(NSMutableString **)string

实际上是

((object)*)string

如果你想给原始对象赋值,你必须使用这个string指针指向的值,而不是它本身(就像在你的模型中发生的那样),否则你最终会修改它指向的东西而不是它的地址所代表的东西. 这就是您的第二个模型有效的原因。您将str,这是一个指向对象(我们再次认为只是一个对象)的指针,原始指针是指针指向的所谓对象string

执行此操作时请注意内存管理。

于 2013-01-24T01:08:49.330 回答