Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 将对象传递给方法?_Iphone_Objective C_Cocoa Touch - Fatal编程技术网

Iphone 将对象传递给方法?

Iphone 将对象传递给方法?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我已经纠正了一些让我在V2中感到困惑的问题,但对于V1正在做什么,我还是有点好奇。看看V1现在我认为行是通过值传递的,对吗(所以本质上我拥有的是行的本地副本)。然后扫描仪将其数据扫描到该本地副本的地址中,当该方法退出且外部变量行仍然为零时,本地副本将被销毁 在V2上,我正在传递行的地址,然后将数据扫描到该地址中,这是否使用引用传递,只是不确定术语 // V1 NSString *line = nil; [self scanUsing:scanner into:line]; NSLog(@"AFT

我已经纠正了一些让我在
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);
}


因为这不是C++,所以不能称之为引用传递。但是,您可以将其称为通过指针传递。(它仍然是按值传递的,但您正在按值传递指针。)


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

,因为这不是C++,不能称之为引用传递。但是,您可以将其称为通过指针传递。(它仍然是按值传递的,但您正在按值传递指针。)


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

在V1中,您正在更改
局部参数的值,该参数仅存在于方法的范围内,您没有更改全局
变量


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

在V1中,您正在更改
局部参数的值,该参数仅存在于方法的范围内,您没有更改全局
变量

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

V1

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

V2

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

因此:

  • V1,通过值传递。传递指针,可以更改指针指向的对象的内容
  • V2,通过引用传递。您将指针传递给指针,因此可以分配内存,从而也可以更改指针地址
V1

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

V2

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

因此:

  • V1,通过值传递。传递指针,可以更改指针指向的对象的内容
  • V2,通过引用传递。您将指针传递给指针,因此可以分配内存,从而也可以更改指针地址

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

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


这通常用于NSError,其中您有一个基本的返回类型,但您还希望在出现错误时发出通知。然后,您传递一个指向错误变量的指针,它们将其作为对NSError对象的引用传递给它。我希望这至少对您有一点意义:)

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

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

这通常用于NSError,其中您有一个基本的返回类型,但您还希望在出现错误时发出通知。然后,您传递一个指向错误变量的指针,它们将其作为对NSError对象的引用传递给它。我希望这对你来说至少有一点意义:)

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