oc的指针是什么
2015-06-02 23:13
316 查看
今天看书的时候看到一种大家应该经常能用到的代码:
之前一直这样用,也没去深入了解为什么要这样用,今天就来解决一下这个问题。
在C语言中,我们会这样使用指针:
p1指的是变量a所在的地址。*p1指的是p1指向的地址的值,即a的值。&a指的是变量a的地址。而oc中的指针跟C语言中的指针是一样的。
在oc中,当我们alloc、init一个对象以后,要访问对象一般直接使用对象的名字,如:
输出为:
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指针的概念以后,我们再回到最上面的那段代码。不用往上翻,我搬下来了。
**)error,说明该参数是一个二级指针,它接收的是一个指针变量的地址,而不是一个对象的地址(指针变量指向的地址)(如果接收对象地址,一般是这样写:(NSError *)error),因此传进去的必须是&error。
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。
相关文章推荐
- android中回调机制,小demo可以理解
- 自定义View视图
- Struts2 技术内幕 读书笔记(第二章)
- Find the all applications of ubuntu
- 所谓的HTTP请求,到底都干了什么
- java基础基本数据类型对象包装
- BZOJ2818 Gcd(欧拉函数)
- 解读 Oracle 12c 的 12 个新特性
- Task 9 从用户界面和体验分析“360极速浏览器”
- iOS开发学习第十一课——动态内存分配
- SIP协议结构——SIP学习笔记(三)
- python 字典应用
- 《找出1到正整数N中出现1的次数》
- [LeetCode] Permutations II
- MvcOptions配置
- android开发小细节
- UVa 1252 Twenty Questions
- onTouchEvent构造器
- Oracle Memory Architecture(SGA,PGA)
- Ubuntu 下 Mysql 新建数据库和用户