NSObject
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.