Eci*_*ana 2 macos cocoa objective-c
来自"objc.h":
typedef struct objc_class *Class;
Run Code Online (Sandbox Code Playgroud)
但在"runtime.h"中:
struct objc_class {
Class isa;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
Run Code Online (Sandbox Code Playgroud)
到底是Class什么?
Joe*_*Joe 10
typedef struct objc_class *Class;
Run Code Online (Sandbox Code Playgroud)
^这是objc_class指针的前向声明.它赋予它友好的友好名称Class.
现在让我们看看objc_class结构:(删除Objective-C 2.0检查以缩短它)
struct objc_class {
Class isa;
};
//This is really saying
struct objc_class {
struct objc_class *isa;
};
Run Code Online (Sandbox Code Playgroud)
所以现在我们有一个指向自己类型的结构.但你为什么这么问?
类'isa(类'类)指向的类在其objc_method_list中包含Class'类方法.了解?运行时中使用的术语是,当对象的isa指向其Class时,Class的isa指向对象的"meta Class".
那么元类'isa指针怎么样?好吧,这指向层次结构的根类(在大多数情况下是NSObject).(在Foundation框架中,NSObject的子类的每个元类都是NSObject的"isa"实例.)是的,顺便说一句,NSObject的元类'isa指向同一个结构 - 它是一个循环引用,因此没有Class'isa永远是NULL.
因此,根据该描述,当您创建一个继承自NSObject您的isa类时,它指向其类类型,该类指向其元类,该类指向其根类(NSObject),该类包含对其自身的循环引用.这解释了为什么它需要两个步骤来确定对象是实例还是类的原因.
假设你创建了以下类:
@interface MyClass : NSObject
@end
@implementation MyClass
@end
Run Code Online (Sandbox Code Playgroud)
如果你能够*遍历isa指针,你会得到以下结果:
*你不能,因为它isa是受保护的.请参阅下面的Cocoa with Love帖子,以创建您自己的实现.
Class c = myClassInstance->isa; //This would be the MyClass
c = c->isa; //This would be MyClass' meta class
c = c->isa; //This would be NSObjects meta class
c = c->isa; //This going forward would still be the NSObjects meta class
...
Run Code Online (Sandbox Code Playgroud)
一旦c == c->isa你知道你是根对象.请记住,Objective-C是C的正确超集,它本身不具有面向对象的构造,例如继承.这与其他实现细节(例如指向构成完整类层次结构的超类的指针)一起允许Objective-C提供面向对象的特性.有关类和元类的更多信息,请参阅Cocoa with Love上的帖子:Objective-C中的元类是什么?
| 归档时间: |
|
| 查看次数: |
1615 次 |
| 最近记录: |