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方法



以后有人说类对象, 其实就是类, 说类, 其实就是指类对象.





好了, 这次我们就讲到之类, 下次我们继续~~~

posted @ 2015-01-24 13:54  背着吉他去流浪  阅读(195)  评论(0编辑  收藏  举报