oc中對指針、對象和%符號的理解
1.我們知道c語言中對於指針的操作是可以直接通過列印指針而得到對象的地址的,如下:
char *s = "abc";
printf("s的值:%s",s);
printf("s的地址:%p",s);
1
2
3
4
列印結果為:
s的值:abc
s的地址:0x107f3ced8
1
2
3
我們知道s其實是指向數據常量區「abc」的一個指針,我們可以通過*s來獲取字元串首字元的值:
printf("首字元為:%c",*s);
1
2
列印結果為:
首字元為:a
1
2
2. 如此我們聯想oc當中的字元串NSString,現在我們用oc的方式初始化一個字元串:
NSString *str = @"abc";
NSLog("str的值為:%@",str);
NSLog("str的地址為:%p",str);
1
2
3
4
列印結果如下:
str的值為:abc
str的地址為:0x1027510c8
1
2
3
3. 通過以上結果分析,我們在列印oc中字元串的值的時候為什麼不能像c語言中直接使用指針*str,而是直接用%@列印str就獲得了對象的值了呢,為什麼不是這樣的:
NSLog("str的值為:%@",*str);
1
2
- 其實NSString本身是一個對象,它不同於char *這些基本類型。本質上OC的對象是一個結構體。
- NSLog在列印%@格式的對象時,會直接調用對象的description方法。與基本數據類型的處理是有區別的。
例如下面的結構體:
typedef struct Object {
char *string;
} *Object;
1
2
3
4
列印的時候會進行如下:
Object obj = malloc(sizeof(Object));
obj->string = "Hello";
NSLog(@"%s", obj->string);
1
2
3
4
所以oc的%@也並不是意味著值的列印,它代表的是列印對象。
※如何提升 Web 應用的代碼質量
※忘記Mysql的root密碼怎麼辦(windows下的mysql)
TAG:程序員小新人學習 |