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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值