您的位置:首页 > 其它

oc的指针是什么

2015-06-02 23:13 316 查看
今天看书的时候看到一种大家应该经常能用到的代码:

NSError *error = nil;
BOOL result = [object performOperationWithError:&error];
该方法的声明为:
- (BOOL)performOperationWithError:](NSError **)error;


之前一直这样用,也没去深入了解为什么要这样用,今天就来解决一下这个问题。
在C语言中,我们会这样使用指针:

int a = 10, *p1, *p2;
p1 = &a;
p2 = p1;


p1指的是变量a所在的地址。*p1指的是p1指向的地址的值,即a的值。&a指的是变量a的地址。而oc中的指针跟C语言中的指针是一样的。

在oc中,当我们alloc、init一个对象以后,要访问对象一般直接使用对象的名字,如:

MyClass *obj = [[MyClass alloc]init];
NSLog(@"obj:%p", obj);
NSLog(@"&obj:%p", &obj);

输出为:



obj是一个指针变量,它指向obj对象的地址。&obj指的是obj这个指针变量所在的地址。

下面分别来看下obj、&obj的内存地址。



上图红框选中的是obj指向的对象的内存地址:0x100200130。(图中的内存地址是倒着来的:01 00 20 01 30->30 01 20 00 01)

绿框选中的是obj指针变量的地址:0x7fff5fbff838,即&obj的地址。

打印obj时输出的内存地址也是:0x100200130,即obj指向的对象的地址。

下面看下obj指向的对象的地址:



绿框选中的是obj指向的对象的地址:0x100200130。红框选中的是该对象的isa指针的地址,右边存的是该对象的实例变量的地址(该对象的实例变量没有被赋值,所以默认为0x000000000)

看完以上的部分以后,我们可以总结出下面这个图。obj指针变量的地址为:0x7fff5fbff838,即&obj的值。该地址里存的是obj指向的对象的地址:0x100200130,obj指向的对象的地址里存的是isa指针和实例变量的地址。



理解了oc指针的概念以后,我们再回到最上面的那段代码。不用往上翻,我搬下来了。

NSError *error = nil;
BOOL result = [object performOperationWithError:&error];
该方法的声明为:
- (BOOL)performOperationWithError:](NSError **)error;
这里为什么要把&error作为参数呢?因为这是一个引用传递,把error的地址传进方法里后,方法外的error的值会随着方法里的error的改变而改变,类似于C语言中把指针作为参数传进函数中。而为什么传的不是error而是&error呢?通过上面的研究,我们知道error的值是error指向的对象的地址,&error的值是error指针变量的地址。我们可以看到performOperationWithError:方法的参数是(NSError
**)error,说明该参数是一个二级指针,它接收的是一个指针变量的地址,而不是一个对象的地址(指针变量指向的地址)(如果接收对象地址,一般是这样写:(NSError *)error),因此传进去的必须是&error。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: