runtime 类和对象的使用和基本的数据结构

类和对象基本的数据结构

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值