指针只是句柄、位置或内存地址。所以你有一个指针,你不是直接操作一个东西,你是在操作指针指向的内存中的东西。
但是,对于像 int 这样的标量值,您正在直接处理该数据。给定语言如何使用指针和值取决于该语言,因此它们的存储位置、访问方式等都会受到影响。
这不是全部,但恕我直言,这是解释它的最简单方法。
现在,在 Objective-C 的上下文中,您不会真正找到很多指向 int 类型的指针,而是会找到一个 int 值。另一方面,对象疯狂地使用指针,它允许您将对象传递给方法,或者在消息中发送它,对其进行修改,并且仍然具有相同的对象,只是发生了变异。
但是,对于该 int,将其作为消息参数传递肯定会传递 int 的值,而不是对它的引用,因此原始 int 将保持不变。
这是pointers的一些文档
这里有一个Objective-C中的例子来指出这一点
让我们暂时假设我们有一个遵循 Apple 的 Objective-C 标准和库的简单 iOS 或 OSX 应用程序。我们还假设我们有一个类 Foo,具有适当定义的标头
#import Foo.h
#import Bar.h
@implementation Foo
- (void) doSomethingWithPointer:(Bar)obj{
obj.x = 5;
}
- (void) doSomethingWithValue:(int)num{
int x = num;
}
- (void) doThings:{
//Suppose I have an object of type Bar available to me. I'm going to get a pointer to a new instance of that object, freshly allocated into memory
Bar *barObj = [Bar alloc];
//we will assume Bar has only one feature, a publicly accessible property called x. It's of the int type, of value 1, but again, is part of the Bar object that we are POINTING to.
//Now, here is a variable that is NOT a POINTER, it's merely a value in memory.
int num = 1;
//Let's call the two methods in this class that perform some action and see what happens.
//first, our pointer
NSLog(@"%d",barObj.x);//outputs 1
[self doSomethingWithPointer:barObj];
NSLog(@"%d",barObj.x);//outputs 5
//Now, let's call on our variable that is just a value and NOT a POINTER
NSLog(@"%d",num);//outputs 1
[self doSomethingWithValue:num];
NSLog(@"%d",num);//outputs 1
}
@end
我在这里演示的不仅仅是指针的概念,还有引用传递的概念。除此之外,我还展示了指针和由变量表示的标量值之间的区别。当我们将您所称的“变量”传递给一个方法时,它在方法中被修改了,但是正如您所看到的,原来的内容保持不变,并且在方法中使用的内容之后没有改变。只有值被传递,而不是对该原始值的引用。
但是,在对象的情况下,我们传递了一个指向对象的指针。由于我们修改了该点表示的对象,在内存中的那个位置,对象内部的值 DID 发生了变化,因为我们本质上是在作用于同一个对象。我们知道在内存中的何处查找它。
如果这仍然没有意义,请在 cmets 中告诉我,我们会解决这个问题的 :)
如果您不太了解指针,我将假设您来自脚本或 Java 背景;)
作为旁注,为什么只有 obj-c 中的对象才会出现这种情况?
对象,或者更确切地说是类的实例,封装数据,并且该数据需要能够保持完整和传递,但如果发生突变,则无论对象的同一实例在哪里,该突变也需要反映在对象的状态中用过。