2013-04-27 133 views
1

我知道C/C++和Objective-C之间存在差异,但涉及指针标记*的情况如何呢?这不是用于Objective-C中的指针,还是用这种语言的所有对象指针? I.E,如果我尝试NSString string = @"Hello";,则XCode告诉我使用NSString *string代替。这是否仍然意味着它是一个指针?Objective-C中的所有对象基本都是指针吗?

比方说,我有这样的标准方法(如,这是方法的大多数方法看):

-(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]; 

或者这是浪费?如果他们已经是指针,我想他们会用这种方式指向指针。

+2

是的。与C++不同,你不能静态地创建一个对象。尝试编译第一个字符串并查看错误消息。 – 2013-04-27 13:01:15

回答

6

对象本身不是指针,它们是存储数据的区域。你在谈论的变量是指向那些对象:

NSString *string = @"Hello"; 

这里,“串”是一个指向NSString文本对象。当传递这个变量作为变量时,你传递的是对象的引用。对象的内容(如果它是一个可变对象,其中NSString不是)可以编辑,但引用不能。

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

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

现在有人可以实例化一个NSError,并返还给您。

除非这是你的意图,你不应该使用指针指针。

相关问题