1.我们知道c语言中对于指针的操作是可以直接通过打印指针而得到对象的地址的,如下:
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的%@也并不是意味着值的打印,它代表的是打印对象。