oc中对指针、对象和%@符号的理解
2017-10-31 18:39
197 查看
1.我们知道c语言中对于指针的操作是可以直接通过打印指针而得到对象的地址的,如下:
打印结果为:
我们知道s其实是指向数据常量区“abc”的一个指针,我们可以通过*s来获取字符串首字符的值:
打印结果为:
2. 如此我们联想oc当中的字符串NSString,现在我们用oc的方式初始化一个字符串:
打印结果如下:
3. 通过以上结果分析,我们在打印oc中字符串的值的时候为什么不能像c语言中直接使用指针*str,而是直接用%@打印str就获得了对象的值了呢,为什么不是这样的:
其实NSString本身是一个对象,它不同于char *这些基本类型。本质上OC的对象是一个结构体。
NSLog在打印%@格式的对象时,会直接调用对象的description方法。与基本数据类型的处理是有区别的。
例如下面的结构体:
打印的时候会进行如下:
所以oc的%@也并不是意味着值的打印,它代表的是打印对象。
char *s = "abc"; printf("s的值:%s",s); printf("s的地址:%p",s);
打印结果为:
s的值:abc s的地址:0x107f3ced8
我们知道s其实是指向数据常量区“abc”的一个指针,我们可以通过*s来获取字符串首字符的值:
printf("首字符为:%c",*s);
打印结果为:
首字符为:a
2. 如此我们联想oc当中的字符串NSString,现在我们用oc的方式初始化一个字符串:
NSString *str = @"abc"; NSLog("str的值为:%@",str); NSLog("str的地址为:%p",str);
打印结果如下:
str的值为:abc str的地址为:0x1027510c8
3. 通过以上结果分析,我们在打印oc中字符串的值的时候为什么不能像c语言中直接使用指针*str,而是直接用%@打印str就获得了对象的值了呢,为什么不是这样的:
NSLog("str的值为:%@",*str);
其实NSString本身是一个对象,它不同于char *这些基本类型。本质上OC的对象是一个结构体。
NSLog在打印%@格式的对象时,会直接调用对象的description方法。与基本数据类型的处理是有区别的。
例如下面的结构体:
typedef struct Object { char *string; } *Object;
打印的时候会进行如下:
Object obj = malloc(sizeof(Object)); obj->string = "Hello"; NSLog(@"%s", obj->string);
所以oc的%@也并不是意味着值的打印,它代表的是打印对象。
相关文章推荐
- OC3-父类指针指向子类对象
- [OC]对象、指针/方法、函数
- 基类指针指向子类对象改如何理解
- OC学习之形参,实参,brake,switch,指针,面对对象
- Core Foundation(C对象)与 Foundation(OC对象)之间的转换 理解
- 第一篇 理解“引用初始化以后不能被改变 指针可以改变所指的对象”这句话
- 【转】对C++类的对象和类的指针的理解
- 父类指针指向子类对象的理解
- 黑马程序员-我的第十二篇学习日记:OC中空指针,野指针,僵尸对象,retain和release基本使用
- iOS 程序内存指针和对象的理解
- oc 关于对象release后 指向它的指针如何处理的问题
- 20150617_OC之父类指针指向子类对象
- 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解
- C++ 父类指针指向子类对象||子类指针指向父类对象的理解
- OC基础-静态类型,动态类型,编译检查,运行检查,父子类指针和对象互指17
- <<Effective OC>>读书笔记 --- 第八条 理解“对象等同”这一概念
- C 指针和OC 对象之间的转换方法
- 对于OC对象,引用以及isa的理解
- 对C++中对象指针的理解
- OC高效率52之理解“类”对象的用意