Objective-c中的所有对象都是指针吗?

Sti*_*Sti 1 cocoa-touch pointers objective-c nsobject ios

我知道C/C++和Objective-C之间存在差异,但是当涉及到指针标记时会出现什么情况*呢?这不是用于Objective-C中的指针,还是用这种语言的所有对象指针?IE,如果我尝试NSString string = @"Hello";,XCode告诉我使用NSString *string.这仍然意味着它是指针吗?

假设我有这种标准方法(就像在大多数方法看起来一样):

-(void)method:(NSString*)s;
Run Code Online (Sandbox Code Playgroud)

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

NSString *string = @"Hello";
[self method:string];
Run Code Online (Sandbox Code Playgroud)

我会通过执行以下操作来节省数据时间或分配或访问权限吗?

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

//and use it like this:
NSString *string = @"Hello";
[self method:&string];
Run Code Online (Sandbox Code Playgroud)

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

Wai*_*ain 7

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

NSString *string = @"Hello";
Run Code Online (Sandbox Code Playgroud)

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

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

NSError *error = nil;
[someone doStuff:(NSString *)string error:(NSError **)error];
Run Code Online (Sandbox Code Playgroud)

现在有人可以实例化NSError并将其返回给您.

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