2

我知道 C/C++ 和 Objective-C 之间存在差异,但是指针标记是什么情况*?这不是用于 Objective-C 中的指针,还是该语言中的所有对象指针?IE,如果我尝试NSString string = @"Hello";,XCode 会告诉我NSString *string改用。这是否仍然意味着它是一个指针?

假设我有这个标准方法(例如,这是大多数方法的外观):

-(void)method:(NSString*)s;

然后我会发送这样的东西:

NSString *string = @"Hello";
[self method:string];

我是否会通过执行以下操作来节省数据时间或分配或访问或其他任何事情:

-(void)method:(NSString**)s;

//and use it like this:
NSString *string = @"Hello";
[self method:&string];

还是浪费?如果它们已经是指针,我猜它们会以这种方式指向指针。

?

4

1 回答 1

8

对象本身不是指针,它们是包含数据的内存区域。您正在谈论的变量是指向这些对象的指针:

NSString *string = @"Hello";

这里,'string' 是一个指向NSString文字对象的指针。当将此作为变量传递时,您传递的是对该对象的引用。对象的内容(如果它是可变对象,NSString则不是)可以编辑,但引用不能。

通过使用NSString **,您添加了额外的间接级别。现在你将一个指针传递给一个指针。您想要这样做的唯一原因是当您想要允许编辑对象(如果有)以及对该对象的引用时。例如,当调用一个可选地返回错误的方法时:

NSError *error = nil;
[someone doStuff:(NSString *)string error:(NSError **)error];

现在有人可以实例化一个NSError并将它返回给你。

除非这是您的意图,否则不应使用指向指针的指针。

于 2013-04-27T13:04:51.427 回答