Objective - C基础: 第四天 - 6.类的本质
在前面, 我们学习了OC的很多语法, 还有书写规范, 在这过程中肯定会有人有很多疑问, 今天我们就来讲讲其中的一个东西, 类的本质, 类的本质其实也是一个对象, 为什么这么说呢, 下面让我们来一起探讨一下:
例子:
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @end @implementation Person @end int main() { Person *p = [[Person alloc]init]; return 0; }
其实在这个例子中, 其实p这个对象, 里面是有两个成员变量, 一个是我们看到的age, 还有一个是isa的一个指针指向Person这个类, 下面让我们来看看示意图:
这就是我们一直以来所创建对象的深层结构, 当然Person继承于NSObject, 所以它也有一个isa指针指向NSObject, 说到这里, 我们知道p这个对象的类型是Person类型, 那么Person是属于什么类型呢? 其实Person是属于Class类型, 也可以说是Class类型的对象, 简称类对象.
示意图:
那么我们怎么获取内存中的类对象呢? 下面让我们来看看:
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @end @implementation Person @end int main() { Person *p = [[Person alloc]init]; Class c = [p class]; Class c1 = [Person class]; NSLog(@"c = %p, c1 = %p", c, c1); return 0; }
结果:
2015-01-24 13:33:11.379 07-类的本质[10550:1139795] c = 0x1000011c0, c1 = 0x1000011c0
这个结果证明了它们所指的对象在内存中都是同一个, 无论你创建再怎么多的对象, 它在内存也就只有一份, 只有一块存储空间.
有人或许会问, 如果我在Person里写一个类方法, 那么用Class是否也可以调用, 答案当然是可以的, 多说无益, 下面让我们来看看实例:
</pre><p></p><p><pre name="code" class="objc">#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; + (void)test; @end @implementation Person + (void)test { NSLog(@"调用了test方法"); } @end int main() { Person *p = [[Person alloc]init]; [Person test]; Class c = [p class]; [c test]; Class c1 = [Person class]; [c1 test]; return 0; }
结果:
2015-01-24 13:49:11.722 07-类的本质[10612:1146229] 调用了test方法 2015-01-24 13:49:11.723 07-类的本质[10612:1146229] 调用了test方法 2015-01-24 13:49:11.723 07-类的本质[10612:1146229] 调用了test方法
以后有人说类对象, 其实就是类, 说类, 其实就是指类对象.
好了, 这次我们就讲到之类, 下次我们继续~~~