找茬--(类方法和实例方法有啥区别?)

区别:

  • self在实例方法中是对象的首地址;在类方法中是Class
  • 类方法存储在元类对象的方法列表中;实例方法存储在类对象的方法列表中

代码:

CFPerson *person = [[CFPerson alloc]init];
[person eating];//实例方法调用
[CFPerson sleeping];//类方法调用

经过编译器转换变为:

((void(*)(id,SEL))(void*)objc_msgSend((id)person,sel_registerName("eating"));
((void(*)(id,SEL))(void*)objc_msgSend(objc_getClass("CFPerson"),sel_registerName("sleeping"));
  • objc_msgSend是通过汇编实现的

实验一:实例对象调用类方法

[person performSelector:@selector(sleeping)];

实验二:类对象调用实例方法

[CFPerson performSelector:@selector(eating)];
  • 以上俩种调用都会崩溃

你可能感兴趣的:(找茬--(类方法和实例方法有啥区别?))