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