类对象的理解及应用

来源:互联网 发布:svd求逆矩阵 编辑:程序博客网 时间:2024/04/28 03:47


1,类的本质其实也是一个对象(类对象,Class类型)


类对象

*类对象在程序运行时一直存在。

*类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等

*每一个对象都包含一个指向其类对象的isa指针。


2、类对象如何获取

通过实例对象获取

Dog*d1 = [Dog new];

Dog*d2 = [Dog new];

Class c =   [d1 class];

Class c2 = [d2 class];


通过类名获取(类名其实就是类对象)

Class c3 = [ Dog  class ];


因为类对象在整个程序中只存在一份,

所以 c = c2 = c3


1,当程序一运行,代码就会加加载到代码区;

2,代码加载完成之后,就会调用+(void)load;方法,创建Class类型类对象;做好程序运行的准备;

3,然后找到main函数执行代码;

4,当遇到new创建对象时,通过当前类的类对象进行创建.


3.类对象的使用

1)可以用来调用类方法:

获取类对象

Class c1 = [Person class];

使用类对象调用类方法

[c1test]; // test是一个+号方法


2)可以用来实例化实例对象, 并且调用对象方法

//获取类对象

Class c1 = [Person class];

//使用类对象创建实例对象

Person *p = [c1 new];

[ptest];  // -test 调用对象方法


4. 类对象存储细节

通过打印地址分析测试:类对象存在常量区;


5.SEL类型(@selector()选择器)

就是对方法的一种包装,将方法包装成SEL类型;


SEL是一种新的数据类型。和idclass一样。

Person *p = [Person new];

SELs1 = @selector(test);

[pperformSelector:s1];


  Person类中有一个方法:

-(void)test:(NSString *)str;


1,Person类加载进内存之后,就会创建Class类型类对象;


2,在内对象中将test:方法包装成SEL类型,并通过IMP*记录test方法的地址;


3,[p test:@""];,会先将test再次包装成SEL类型,然后拿着这个新包装的SELPerson类对象中去找,找到跟自己相同的SEL之后,就会通过地址调用这个方法;如果找不到就直接报错;


类对象的使用:


#pragma mark main.m

#import

#import"Person.h"

intmain(intargc, constchar* argv[]) {

   @autoreleasepool {

       //获取类对象

       Class c1 = [Personclass];

      //c1 -----> Person

      //使用类对象创建实例对象

       Person*p = [c1 new];

       [ptest]; // -test 表示对象创建成功,c1Person来用的

      //使用类对象调用类方法

       [c1 test];//+test

    }

    return0;

}


#pragma mark Person.h

#import

@interfacePerson :NSObject

-(void)test;

+(void)test;

  @end


#pragmamark Person.m

#import"Person.h"

@implementation Person

-(void)test{

    NSLog(@"-test!");

}

+(void)test{

    NSLog(@"+test!");

}

  @end


0 0
原创粉丝点击