ios高级开发,runtime(一)

创建公共类:

@interface CustomClass : NSObject

- (void) fun1;

@end

 

@implementation CustomClass

-(void)fun1

{

    NSLog(@"fun1");

}

@end

 

@interface TestClass : NSObject

 

@end

 

@implementation TestClass

 

@end

 

1、对象拷贝:id object_copy(id obj, size_t size)

CustomClass * obj = [CustomClass new];

        NSLog(@"%p",&obj);

        

        id objTest = object_copy(obj, sizeof(obj));

        NSLog(@"%p",&objTest);

        

        [objTest fun1];

 

打印结果:

2014-10-20 09:51:48.973 runtimetest[2573:303] 0x7fff5fbff818

2014-10-20 09:51:48.983 runtimetest[2573:303] 0x7fff5fbff810

2014-10-20 09:51:48.984 runtimetest[2573:303] fun1

说明:

object_copy 函数实现了对象的拷贝。

2、对象释放 id object_dispose(id obj)

 

object_dispose(objTest);

        [objTest release];

runtimetest(2791,0x7fff791b2310) malloc: *** error for object 0x100202950: pointer being freed was not allocated

 

3、更改对象的类/获取对象的类Class object_setClass(id obj, Class cls)  / Class object_getClass(id obj)

 

        CustomClass * obj = [CustomClass new];

        [obj fun1];

        

        Class aClass = object_setClass(obj, [CustomClassOther class]);

        NSLog(@"aClass:%@",NSStringFromClass(aClass));

        

        NSLog(@"obj class:%@",NSStringFromClass([obj class]));

        [obj fun2];

运行结果:

2014-10-20 10:09:24.619 runtimetest[3536:303] aClass:CustomClass

2014-10-20 10:09:24.619 runtimetest[3536:303] obj class:CustomClassOther

2014-10-20 10:09:24.620 runtimetest[3536:303] fun2

CustomClass * obj = [CustomClass new];

        Class objClass = object_getClass(obj);

        NSLog(@"%@",NSStringFromClass(objClass));

运行结果:

2014-10-20 10:12:34.047 runtimetest[3726:303] CustomClass

 

4、获取对象的类名  constchar *object_getClassName(id obj)

 

CustomClass * obj = [CustomClass new];

        NSString * className =[NSString stringWithCString:object_getClassName(obj) encoding:NSUTF8StringEncoding];

        NSLog(@"%@",className);

运行结果:

2014-10-20 10:22:54.514 runtimetest[4160:303] CustomClass

5、给一个类添加方法  

BOOL class_addMethod(Class cls,SEL name,IMP imp, 

 

const char *types)

 

 

 

 

/**

  * 一个参数

  *

  */

 

int cfunction(id self, SEL _cmd, NSString *str) {

    NSLog(@"%@", str);

    return10;//随便返回个值

}

 

- (void) oneParam {

    

    TestClass *instance = [[TestClassalloc]init];

    //    方法添加

    class_addMethod([TestClassclass],@selector(ocMethod:), (IMP)cfunction,"i@:@");

    

    if ([instance respondsToSelector:@selector(ocMethod:)]) {

        NSLog(@"Yes, instance respondsToSelector:@selector(ocMethod:)");

    } else

    {

        NSLog(@"Sorry");

    }

    

    int a = (int)[instanceocMethod:@"我是一个OCmethodC函数实现"];

    NSLog(@"a:%d", a);

 

}

2014-10-20 10:47:25.738 runtimetest[5333:303] Yes, instance respondsToSelector:@selector(ocMethod:)

2014-10-20 10:47:25.748 runtimetest[5333:303] 我是一个OCmethodC函数实现

2014-10-20 10:47:25.749 runtimetest[5333:303] a:10

 

 

 /**

  * 两个参数

  *

  */

 

int cfunctionA(id self, SEL _cmd, NSString *str, NSString *str1) {

    NSLog(@"%@-%@", str, str1);

    return20;//随便返回个值

}

 

- (void) twoParam {

    

    TestClass *instance = [[TestClassalloc]init];

    

    class_addMethod([TestClassclass],@selector(ocMethodA::), (IMP)cfunctionA,"i@:@@");

    

    if ([instance respondsToSelector:@selector(ocMethodA::)]) {

        NSLog(@"Yes, instance respondsToSelector:@selector(ocMethodA::)");

    } else

    {

        NSLog(@"Sorry");

    }

    

    int a = (int)[instanceocMethodA:@"我是一个OC的method,C函数实现" :@"-----我是第二个参数"];

    NSLog(@"a:%d", a);

}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。