Objective-C之类的本质

一.类也是个对象:

         其实类也是一个对象,是Class 类型的对象,简称 “类对象”


Class 类型的定义:(官方认证)

#if !OBJC_TYPES_DEFINED
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;
#endif

类名 就代表着类对象,每一个类就只有一个类对象。

//利用Person这个类,创建3个Person类型的对象,这三个对象相互独立的,互不干扰.
Person *p  = [[Person alloc] init];

Person *p2 = [[Person alloc] init];

Person *p3 = [[Person alloc] init];

*[Person alloc] , 【0类对象 调用类方法】(类方法在元类中,它会检查类对象有没有alloc方法,没有就去类对象中找),根据person类对象在内存中开辟一个内存空间,返回一个实例化的对象。

*类对象 在程序中就只有一份,而每次alloc,都产生一个新的实例对象。

//获取内存中的类对象
Class c = [p class];

Class C2 = [p2 class];

Class c3 = [person class];


NSLog(@"c = %p, c2 = %p, c3 = %p",c,c2,c3);
//c=0x1000059d0 c2 = 0x1000059d0 c3 = 0x1000059d0;

 注意:c和c1和c2打印出来的地址相同,可以证明所有的对象共用一个类方法(class)。

 

二.+load 和 initialize

+load:

  1. 在程序启动的时候会加载所有的类和分类,并调用所有类和分类的 +load方法
  2. 先加载父类,再加载子类,也就是先调用父类的+load,在调用子类的+load
  3. 先加载原始类,在加载分类
  4. 不管程序运行过程中有没有用到这个类,都会调用+load加载

 

+initialize

  • 在第一次使用某个类时(比如创建对象等),就会调用一次 +initialize方法
  • 一个类只会调用一次 +initialize 方法,先调用父类的,再调用子类的

注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。
 

 

三.获取类对象三种方式:

Class c = [person class];//类方法
//或者
Person *p  = [Person new];
Class c2 = [p class];


//类对象调用类方法
Class  c  =[Person class];
Person *p2 = [c new];

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值