NSObject.h头文件,在XCode 里Foundation.framework下的Headers里,也在系统里找到原文件:
/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSObject.h
到 /usr/include/objc 下面找到 runtime 的 Object.h 等头文件,也可以在开发工具的SDK 里找到:
/Developer/SDKs/MacOSX10.4u.sdk/usr/include/objc/
再参照 OpenDarwin 里 Object.m 的实施代码。
1. 关于 isa:
@interface Object
{
Class isa; /* A pointer to the instance's class structure */
}
NSObject 只有一个类型为Class 的实例变量 isa .
Class 是object_class 这个ANSI C结构的 typedef, objc.h 里有Class 的定义:
ttypedef struct objc_class *Class;
isa实际上是指向一个类结构的指针 ( struct objc_class *isa;), 它使得 runtime 能够判断出一个实例的类。
/*
* objc-class.h
* Copyright 1988-1996, NeXT Software, Inc.
*/
#import <objc/objc.h>
/*
* Class Template
*/
struct objc_class {
struct objc_class *isa;
struct objc_class *super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
};
程序中不需要直接读取 isa, 通常是调用 - class 方法。
@implementation Object
- class
{
return (id)isa;
}
typedef struct objc_object {
Class isa;
} *id;
2,回到 NSObject,
@interface Object
/* Initializing classes and instances */
+ initialize;
- init;
@implementation Object
+ initialize
{
return self;
}
- awake
{
return self;
}
+ new
{
id newObject = (*_alloc)((Class)self, 0);
struct objc_class * metaClass = ((struct objc_class *) self)->isa;
if (metaClass->version > 1)
return [newObject init];
else
return newObject;
}
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
+ allocFromZone:(void *) z
{
return (*_zoneAlloc)((Class)self, 0, z);
}
- init
{
return self;
}
- self
{
return self;
}