前言:
最近研究runtime,觉得里面的东西好深,所以决定先把苹果提供的runtime.h文件简单的翻译一下,关于用法会在之后进行一些分享。
/* Types */ #if !OBJC_TYPES_DEFINED /// An opaque type that represents a method in a class definition. typedef struct objc_method *Method; /// An opaque type that represents an instance variable. typedef struct objc_ivar *Ivar; /// An opaque type that represents a category. typedef struct objc_category *Category; /// An opaque type that represents an Objective-C declared property. typedef struct objc_property *objc_property_t;
这四个type 分别是:
(类中不确定类型的一个方法)、(不确定类型的一个实例变量)、(不确定类型的一个类目)、(不确定的OC的属性声明)
struct objc_class { Class isa OBJC_ISA_AVAILABILITY; #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 } OBJC2_UNAVAILABLE; /* Use `Class` instead of `struct objc_class *` */ #endif
这是定义一个objc_class 结构体;
#ifdef __OBJC__ @class Protocol; #else typedef struct objc_object Protocol; #endif /// Defines a method struct objc_method_description { SEL name; /**< The name of the method */ char *types; /**< The types of the method arguments */ }; /// Defines a property attribute typedef struct { const char *name; /**< The name of the attribute */ const char *value; /**< The value of the attribute (usually empty) */ } objc_property_attribute_t;
这段代码,我理解的就是定义的两个结构体,关于结构体,有机会写一篇内容;
/* Functions */ /* Working with Instances */ /** * Returns a copy of a given object. * * @param obj An Objective-C object. * @param size The size of the object \e obj. * * @return A copy of \e obj. */ OBJC_EXPORT id object_copy(id obj, size_t size) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0) OBJC_ARC_UNAVAILABLE; /** * Frees the memory occupied by a given object. * * @param obj An Objective-C object. * * @return nil */ OBJC_EXPORT id object_dispose(id obj) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0) OBJC_ARC_UNAVAILABLE; /** * Returns the class of an object. * * @param obj The object you want to inspect. * * @return The class object of which \e object is an instance, * or \c Nil if \e object is \c nil. */ OBJC_EXPORT Class object_getClass(id obj) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); /** * Sets the class of an object. * * @param obj The object to modify. * @param cls A class object. * * @return The previous value of \e object‘s class, or \c Nil if \e object is \c nil. */ OBJC_EXPORT Class object_setClass(id obj, Class cls) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); /** * Returns whether an object is a class object. * * @param obj An Objective-C object. * * @return true if the object is a class or metaclass, false otherwise. */ OBJC_EXPORT BOOL object_isClass(id obj) __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0); /** * Returns the class name of a given object. * * @param obj An Objective-C object. * * @return The name of the class of which \e obj is an instance. */ OBJC_EXPORT const char *object_getClassName(id obj) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
从/*Functions*/开始就是一些方法(都是实例方法):
1、id object_copy(id obj, size_t size) 返回的是传过来的对象的一个副本,需要的参数是 一个OC的对象,和对象的大小
2、id object_dispose(id obj) 释放给定的对象的内存
3、Class object_getClass(id obj) 返回的是对象的类
4、Class object_setClass(id obj, Class cls) 设置对象的类,参数是要修改的对象,一个类对象
5、BOOL object_isClass(id obj) 返回对象是否一个类的对对象
6、const char *object_getClassName(id obj) 返回给定的对象的类名(备注:类名是这个对象的实例?)
/** * Returns a pointer to any extra bytes allocated with an instance given object. * * @param obj An Objective-C object. * * @return A pointer to any extra bytes allocated with \e obj. If \e obj was * not allocated with any extra bytes, then dereferencing the returned pointer is undefined. * * @note This function returns a pointer to any extra bytes allocated with the instance * (as specified by \c class_createInstance with extraBytes>0). This memory follows the * object‘s ordinary ivars, but may not be adjacent to the last ivar. * @note The returned pointer is guaranteed to be pointer-size aligned, even if the area following * the object‘s last ivar is less aligned than that. Alignment greater than pointer-size is never * guaranteed, even if the area following the object‘s last ivar is more aligned than that. * @note In a garbage-collected environment, the memory is scanned conservatively. */ OBJC_EXPORT void *object_getIndexedIvars(id obj) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0) OBJC_ARC_UNAVAILABLE; /** * Reads the value of an instance variable in an object. * * @param obj The object containing the instance variable whose value you want to read. * @param ivar The Ivar describing the instance variable whose value you want to read. * * @return The value of the instance variable specified by \e ivar, or \c nil if \e object is \c nil. * * @note \c object_getIvar is faster than \c object_getInstanceVariable if the Ivar * for the instance variable is already known. */ OBJC_EXPORT id object_getIvar(id obj, Ivar ivar) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); /** * Sets the value of an instance variable in an object. * * @param obj The object containing the instance variable whose value you want to set. * @param ivar The Ivar describing the instance variable whose value you want to set. * @param value The new value for the instance variable. * * @note \c object_setIvar is faster than \c object_setInstanceVariable if the Ivar * for the instance variable is already known. */ OBJC_EXPORT void object_setIvar(id obj, Ivar ivar, id value) __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0); /** * Changes the value of an instance variable of a class instance. * * @param obj A pointer to an instance of a class. Pass the object containing * the instance variable whose value you wish to modify. * @param name A C string. Pass the name of the instance variable whose value you wish to modify. * @param value The new value for the instance variable. * * @return A pointer to the \c Ivar data structure that defines the type and * name of the instance variable specified by \e name. */ OBJC_EXPORT Ivar object_setInstanceVariable(id obj, const char *name, void *value) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0) OBJC_ARC_UNAVAILABLE; /** * Obtains the value of an instance variable of a class instance. * * @param obj A pointer to an instance of a class. Pass the object containing * the instance variable whose value you wish to obtain. * @param name A C string. Pass the name of the instance variable whose value you wish to obtain. * @param outValue On return, contains a pointer to the value of the instance variable. * * @return A pointer to the \c Ivar data structure that defines the type and name of * the instance variable specified by \e name. */ OBJC_EXPORT Ivar object_getInstanceVariable(id obj, const char *name, void **outValue) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0) OBJC_ARC_UNAVAILABLE; /* Obtaining Class Definitions */ /** * Returns the class definition of a specified class. * * @param name The name of the class to look up. * * @return The Class object for the named class, or \c nil * if the class is not registered with the Objective-C runtime. * * @note \c objc_getClass is different from \c objc_lookUpClass in that if the class * is not registered, \c objc_getClass calls the class handler callback and then checks * a second time to see whether the class is registered. \c objc_lookUpClass does * not call the class handler callback. * * @warning Earlier implementations of this function (prior to OS X v10.0) * terminate the program if the class does not exist. */ OBJC_EXPORT Class objc_getClass(const char *name) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0); /** * Returns the metaclass definition of a specified class. * * @param name The name of the class to look up. * * @return The \c Class object for the metaclass of the named class, or \c nil if the class * is not registered with the Objective-C runtime. * * @note If the definition for the named class is not registered, this function calls the class handler * callback and then checks a second time to see if the class is registered. However, every class * definition must have a valid metaclass definition, and so the metaclass definition is always returned, * whether it’s valid or not. */ OBJC_EXPORT Class objc_getMetaClass(const char *name) __OSX_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
时间: 2024-10-14 08:04:03