Just a little smile ^ ^

yoyo_zeng

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

When you send a message like [NSObject alloc] you are actually sending a message to the class object and that class object needs to be an instance of the MetaClass which itself is an instance of the root meta class

The basic implementation of a class in Objective-C looks like 

interface MyClass : NSObject {

//vars

NSInteger counter;

}

//methods

-voiddoFoo;

end

but the runtime has more than that to keep track of 

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

 

Objective-C Associated Objects
One thing recently introduced in Mac OS X 10.6 Snow Leopard was called Associated References. Objective-C has no support for dynamically adding on variables to objects unlike some other languages that have native support for this. So up until now you would have had to go to great lengths to build the infrastructure to pretend that you are adding a variable onto a class. Now in Mac OS X 10.6 the Objective-C Runtime has native support for this. If we wanted to add a variable to every class that already exists like say NSView we could do so like this... 

import < Cocoa/Cocoa.h> //Cocoa

include < objc/runtime.h> //objc runtime api’s

 

interface NSView CustomAdditions

propertyretain NSImage *customImage;

end

 

implementation NSView CustomAdditions

 

static char img_key; //has a unique address identifier

 

-NSImage *customImage

{

    return objc_getAssociatedObjectself&img_key;

}

 

-voidsetCustomImage:NSImage *image

{

    objc_setAssociatedObjectself&img_keyimage

                             OBJC_ASSOCIATION_RETAIN;

}

posted on 2012-11-12 14:01  yoyo_zeng  阅读(140)  评论(0编辑  收藏  举报