类和对象基本的数据结构
struct objc_class {
// typedef struct objc_class *Class;
// 所有的类自身也是一个对象,这个对象的Class里面也有一个isa指针,它指向metaClass(元类)
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE; //父类
const char *name OBJC2_UNAVAILABLE; //类名
long version OBJC2_UNAVAILABLE; //类的版本信息,默认是0
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
方法操作函数
// 添加方法
BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types );
// 获取实例方法
Method class_getInstanceMethod ( Class cls, SEL name );
// 获取类方法
Method class_getClassMethod ( Class cls, SEL name );
// 获取所有方法的数组
Method * class_copyMethodList ( Class cls, unsigned int *outCount );
// 替代方法的实现
IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types );
// 返回方法的具体实现
IMP class_getMethodImplementation ( Class cls, SEL name );
IMP class_getMethodImplementation_stret ( Class cls, SEL name );
// 类实例是否响应指定的selector
BOOL class_respondsToSelector ( Class cls, SEL sel );
成员变量操作函数
// 获取类中指定名称实例成员变量的信息
Ivar class_getInstanceVariable ( Class cls, const char *name );
// 获取类成员变量的信息
Ivar class_getClassVariable ( Class cls, const char *name );
// 添加成员变量
BOOL class_addIvar ( Class cls, const char *name, size_t size, uint8_t alignment, const char *types );
// 获取整个成员变量列表
Ivar * class_copyIvarList ( Class cls, unsigned int *outCount );
属性操作函数
// 获取指定的属性
objc_property_t class_getProperty ( Class cls, const char *name );
// 获取属性列表
objc_property_t * class_copyPropertyList ( Class cls, unsigned int *outCount );
// 为类添加属性
BOOL class_addProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );
// 替换类的属性
void class_replaceProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );
协议
// 添加协议
BOOL class_addProtocol ( Class cls, Protocol *protocol );
// 返回类是否实现指定的协议
BOOL class_conformsToProtocol ( Class cls, Protocol *protocol );
// 返回类实现的协议列表
Protocol * class_copyProtocolList ( Class cls, unsigned int *outCount );
example
//
// TestClass.h
// RunTimeExample
//
// Created by kobe on 16/2/24.
// Copyright (c) 2016年 kobe. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface TestClass : NSObject<NSCopying,NSCoding>
@property(nonatomic,strong)NSArray *array;
@property(nonatomic,copy)NSString *string;
-(void)method1;
-(void)method2;
+(void)classMethod1;
@end
//
// TestClass.m
// RunTimeExample
//
// Created by kobe on 16/2/24.
// Copyright (c) 2016年 kobe. All rights reserved.
//
#import "TestClass.h"
@interface TestClass()
{
NSInteger _instance1;
NSString *_instance2;
}
@property(nonatomic,assign)NSInteger integer;
-(void)method3WithArg1:(NSInteger)arg1 arg2:(NSString *)arg2;
@end
@implementation TestClass
+(void)classMethod1{
}
-(void)method1{
NSLog(@"call method method1");
}
-(void)method2{
}
-(void)method3WithArg1:(NSInteger)arg1 arg2:(NSString *)arg2{
NSLog(@"arg1 : %ld, arg2 : %@", arg1, arg2);
}
@end
//
// ViewController.m
// RunTimeExample
//
// Created by kobe on 16/2/24.
// Copyright (c) 2016年 kobe. All rights reserved.
//
#import "ViewController.h"
#import "TestClass.h"
#import <objc/runtime.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self showDetailText];
}
-(void)showDetailText{
TestClass *testClass=[[TestClass alloc]init];
unsigned int outCount=0;
Class cls=testClass.class;
//获取类名
NSLog(@"class name: %s",class_getName(cls));
//获取父类名
NSLog(@"super class name: %s",class_getName(class_getSuperclass(cls)));
//该类是否是元类
NSLog(@"TestClass is %@ a meta_class",(class_isMetaClass(cls) ? @"":@"not"));
//返回该类名称的一个元类
Class meta_class=objc_getMetaClass(class_getName(cls));
NSLog(@"%s's meta-class is %s",class_getName(cls),class_getName(meta_class));
//返回实例变量的大小
NSLog(@"instance size:%zu",class_getInstanceSize(cls));
//获取成员变量
Ivar *ivars=class_copyIvarList(cls, &outCount);
for (int i=0; i<outCount; i++) {
Ivar ivar=ivars[i];
NSLog(@"instance variable's name: %s at index: %d",ivar_getName(ivar),i);
}
free(ivars);
// 获取类中指定名称实例成员变量的信息
Ivar string=class_getInstanceVariable(cls, "string");
if (string!=NULL) {
NSLog(@"instance variable %s",ivar_getName(string));
}
//属性操作
objc_property_t *properties=class_copyPropertyList(cls, &outCount);
for (int i=0; i<outCount; i++) {
objc_property_t property=properties[i];
NSLog(@"property's name: %s",property_getName(property));
}
free(properties);
// 获取指定的属性
objc_property_t array=class_getProperty(cls, "array");
if (array!=NULL) {
NSLog(@"property %s",property_getName(array));
}
//方法的操作
Method *methods=class_copyMethodList(cls, &outCount);
for (int i=0; i<outCount; i++) {
Method method=methods[i];
NSLog(@"method's signature: %s",method_getName(method));
}
free(methods);
// 获取实例方法
Method method1=class_getInstanceVariable(cls, @selector(method1));
if (method1!=NULL) {
NSLog(@"method %s",method_getName(method1));
}
// 获取类方法
Method classMethod=class_getClassMethod(cls, @selector(classMethod1));
if (classMethod !=NULL) {
NSLog(@"class method : %s",method_getName(classMethod));
}
// 类实例是否响应指定的selector
NSLog(@"TestClass is %@ responsd to selector:method3WithArg1:arg2:",class_respondsToSelector(cls, @selector(method3WithArg1:arg2:))?@"":@"not");
// 返回方法的具体实现
IMP imp=class_getMethodImplementation(cls, @selector(method1));
imp();
//协议
Protocol * __unsafe_unretained * protocols=class_copyProtocolList(cls, &outCount);
Protocol *protocol;
for (int i=0; i<outCount; i++) {
protocol=protocols[i];
NSLog(@"protocol name: %s",protocol_getName(protocol));
}
// 返回类是否实现指定的协议
NSLog(@"TestClass is %@ responsed to protocol %s",class_conformsToProtocol(cls, protocol)?@"":@"not",protocol_getName(protocol));
}
@end
动态创建类
// 创建一个新类和元类
Class objc_allocateClassPair ( Class superclass, const char *name, size_t extraBytes );
// 销毁一个类及其相关联的类
void objc_disposeClassPair ( Class cls );
// 在应用中注册由objc_allocateClassPair创建的类
void objc_registerClassPair ( Class cls );
example
//动态创建一个类
-(void)addClass{
//创建一个新类和元类
Class cls=objc_allocateClassPair(TestClass.class, "TestSubClass", 0);
//cls:被添加方法的类
//name 方法名
//imp:实现这个方法的函数
//types:一个定义该函数返回值类型和参数类型的字符串
//添加方法
class_addMethod(cls,@selector(subclassmethod), (IMP)method,"v@:");
//替代实现的方法
class_replaceMethod(cls, @selector(method1), (IMP)method,"v@:");
//添加变量
class_addIvar(cls, "_ivar1", sizeof(NSString *), log(sizeof(NSString *)),"i");
//属性
objc_property_attribute_t type={"T","@\"NSString\""};
objc_property_attribute_t ownership={"C",""};
objc_property_attribute_t backingivar={"V","_ivar1"};
objc_property_attribute_t attrs[]={type,ownership,backingivar};
class_addProperty(cls, "property2", attrs, 3);
objc_registerClassPair(cls);
//实例
id instance=[[cls alloc]init];
[instance performSelector:@selector(subclassmethod)];
[instance performSelector:@selector(method1)];
}
//动态添加的方法
void method(id self, SEL _cmd) {
NSLog(@"hello");
}