2012-10-11 62 views
1

我纠正了一些在V2中令我困惑的东西,但我仍然对V1正在做什么感到好奇。看看V1现在我正确地认为该行正在被值传递(所以基本上我所拥有的是本地副本)。然后扫描程序将其数据扫描到本地副本的地址中,当方法退出并且外部变量行仍然为零时,本地副本将被销毁?将对象传递给方法?

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); 
} 

回答

1

V1

你传入指针的副本。它指向相同的内存区域,所以你看到的是相同的值。然后您按价值传递对象。您可以更改内容,但不能创建新对象,因为该方法结束时该指针不存在。的参考

V2

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

所以:

  • V1,按值传递。您传递指针,并可以更改指针指向的对象的内容。
  • V2,通过参考。您将指针传递给指针,因此可以分配内存,因此也更改指针地址。
1

因为这不是C++,所以不能称之为传递引用。但是,您可以将其称为传递指针。 (这仍然是按值,但你按值传递一个指针

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

+0

非常感谢。 – fuzzygoat

1

在V1中,您正在更改line本地参数的值,该值仅存在于该方法的范围内,因此不会更改全局变量line

在V2,你有效地通过引用传递全球line指针,它可以让你改变它的价值...

1

在第一示例中,要传递到的对象的引用。 在第二个示例中,您传递对对象引用的引用。

如果您在第一个示例中记录了行对象,则会看到差异,而在第二个示例中,您会看到在该方法内设置的对象。

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