1

我已经纠正了一些让我感到困惑的事情,V2但我仍然对正在做什么感到有点好奇V1。现在看看V1我是否认为该行是按值传递的(所以基本上我所拥有的是行的本地副本)。Scanner 然后将其数据扫描到该本地副本的地址中,当方法退出并且外部变量 line 仍然为 nil 时,本地副本被销毁?

V2,我正在传递行的地址,然后将数据扫描到该地址,这是使用引用传递,只是不确定术语吗?

// V1
NSString *line = nil;
[self scanUsing:scanner into:line];
NSLog(@"AFTER_: %@", line);

- (void)scanUsing:(NSScanner *)scanner into:(NSString *)line {
    [scanner scanUpToString:@"\n" intoString:&line];
    NSLog(@"INSIDE: %@", line);
}

.

// V2     
NSString *line = nil;
[self scanUsing:scanner into:&line];
NSLog(@"AFTER_: %@", line);

- (void)scanUsing:(NSScanner *)scanner into:(NSString **)line {
    [scanner scanUpToString:@"\n" intoString:line];
    NSLog(@"INSIDE: %@", *line);
}
4

4 回答 4

1

由于这不是 C++,因此不能将其称为传递引用。但是,您可以将其称为按指针传递。(这仍然是按值,但您是按值传递指针。)

除了语法nazi:第一个版本只修改了本地副本line(即函数内部的那个);你实际传入的那个保持不变。

于 2012-10-11T10:29:40.417 回答
1

在 V1 中,您正在更改line仅存在于方法范围内的局部参数的值,而不是更改全局line变量。

在 V2 中,您可以通过引用有效地传递全局line指针,这允许您更改其值...

于 2012-10-11T10:32:57.507 回答
1

V1

您正在传递指针的副本。它指向同一个内存区域,所以你看到的是同一个值。然后,您将按值传递对象。您可以更改内容,但不能创建新对象,因为该方法完成后该指针将不存在。

V2

引用的定义不同(它是 C++ 类型)但是是的,可以说它的行为或多或少相同。在 V2 中,可以在方法内部分配一个新对象,因此,您可以更改它所指向的内存区域。

所以:

  • V1,按值传递。您传递指针,并且可以更改指针指向的对象的内容。
  • V2,通过引用传递。您将指针传递给指针,因此您可以分配内存,因此也可以更改指针地址。
于 2012-10-11T10:34:37.820 回答
1

在第一个示例中,您正在传递对对象的引用。在第二个示例中,您将引用传递给对象的引用。

如果您在第一个示例中记录 line-object,您会看到差异,而在第二个示例中,您会看到您在方法中设置的对象。

这通常用于 NSError,你有一个基本的返回类型,但你也想通知是否有错误。然后传递一个指向错误变量的指针,然后他们将引用传递给 NSError 对象。我希望这对你来说至少有点意义:)

于 2012-10-11T10:34:53.140 回答