类对象存储实例方法列表等信息
类对象是程序猿定义并在运行时由编译器创建的,它没有自己的实例变量,这里需要注意的是类的成员变量和实例方法是属于实例对象的,但其存储于类对象当中的。
实例对象是我们对类对象alloc或者new操作时所创建的,在这个过程中会拷贝实例所属类的成员变量,但并不拷贝类定义的方法.调用实例方法时,系统会根据实例的isa指针去类的方法列表及父类的方法列表中寻找与消息对应的selector指向的方法。
元类对象存储类方法列表等信息
元类对象即是描述类对象的类,每个类都有自己的元类,也就是结构体objc_class中isa指向的类。Objective_C的类方法是使用元类的根本原因,其中存储着对应的类对象调用的方法即类方法。
仅仅是一个编译指示器,为编辑器关键之,就是给编译器看的,不是一个指针。 本质:只要编译器看到super这个标志,就会让当前对象去调用父类方法,本质还是当前对象在调用。
获取当前方法的调用者的类;
获取当前方法的调用者的父类;
#import "Person.h" @implementation Person - (void)test { NSLog(@"%@,%@,%@,%@",[self class],[self superclass],[super class], [super superclass]); 打印结果 //Person,NSObject,Person,NSObject } @end动态创建方法
方法替换
@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _var;
@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法@dynamic告诉编译器:属性的setter与getter方法由用户自己实现,不自动生成(当然对于readonly的属性只需提供getter即可)假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = instance.var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定