Runtime学习1

最近在研究Runtime,感觉都是一知半解。

所以接敲了一个demo。

自己再学习下。

很多东西都是不知道。

以下是掌握这几个方法。

#warning 对象拷贝 \

id object_copy(id obj, size_t size)


#warning 对象释放 \

id object_dispose(id obj)


#warning 更改对象的类 \

Class object_setClass(id obj, Class cls) 


#warning 获取对象的类 \

Class object_getClass(id obj)


#warning 获取对象的类名 \

constchar *object_getClassName(id obj)


#warning 给类添加一个方法\

BOOL class_addMethod(Class cls,SEL name,IMP imp,const char *types)

/*

    BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

    参数说明:

    cls:被添加方法的类

    name:可以理解为方法名

    imp:实现这个方法的函数

    types:一个定义该函数返回值类型和参数类型的字符串

 

 */


CustomClass

//
//  CustomClass.m
//  Runtime学习1
//
//  Created by 陆巧怡 on 15/7/31.
//  Copyright (c) 2015年 Simon. All rights reserved.
//

#import "CustomClass.h"

@implementation CustomClass
-(void)func1{
    
    NSLog(@"func1");
}
@end

CustomClassOther

//
//  CustomClassOther.m
//  Runtime学习1
//
//  Created by 陆巧怡 on 15/7/31.
//  Copyright (c) 2015年 Simon. All rights reserved.
//

#import "CustomClassOther.h"

@implementation CustomClassOther
-(void)func2{
    
    NSLog(@"func2");
}
@end

实现代码 demo

//
//  ViewController.m
//  Runtime学习1
//
//  Created by 陆巧怡 on 15/7/31.
//  Copyright (c) 2015年 Simon. All rights reserved.
//

#import "ViewController.h"
//#import <objc/runtime.h>
#include<objc/runtime.h>
#import "CustomClass.h"
#import "CustomClassOther.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self twoParam];
    
    
}

#warning 对象拷贝 \
id object_copy(id obj, size_t size)
-(void)object_Copy_Func{
    
    CustomClass *obj = [[CustomClass alloc]init];
    NSLog(@"地址:%p", &obj);
    id objectTest = object_copy(obj,sizeof(obj));
    NSLog(@"地址:%p", &objectTest);
    // 拷贝的对象后 调用原有对象的方法
    [objectTest func1];
}

#warning 对象释放 \
id object_dispose(id obj)
-(void)object_dispose_Func{
    
    CustomClass *obj = [[CustomClass alloc]init];
    NSLog(@"地址:%p", &obj);
    
    object_dispose(obj);
    //释放对象
    [obj release];
    //调用方法崩溃
    [obj func1];
    
}

#warning 更改对象的类 \
Class object_setClass(id obj, Class cls) 
-(void)setClassText{
    
    CustomClass *obj = [[CustomClass alloc]init];
    //获取对象的类
    NSLog(@"obj原来的类%@",NSStringFromClass([obj class]));

    //更改对象的类
    Class change = object_setClass(obj, [CustomClassOther class]);
    NSLog(@"change 的类%@",NSStringFromClass(change));
    NSLog(@"obj更改后的类%@",NSStringFromClass([obj class]));
    //更改类之后调用新类的方法
    [obj func2];
}

#warning 获取对象的类 \
Class object_getClass(id obj)
-(void)getClassText{
    
    CustomClass *obj = [[CustomClass alloc]init];
    //获取对象的类
    Class objectClass = object_getClass(obj);
    NSLog(@"%@",NSStringFromClass(objectClass));
}

#warning 获取对象的类名 \
constchar *object_getClassName(id obj)
-(void)getClassName{
    
    CustomClass *obj = [[CustomClass alloc]init];
    NSString *className = [NSString stringWithCString:object_getClassName(obj) encoding:NSUTF8StringEncoding];
    NSLog(@"%@",className);
}

#warning 给类添加一个方法\
BOOL class_addMethod(Class cls,SEL name,IMP imp,const char *types)
/*
    BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
    参数说明:
    cls:被添加方法的类
    name:可以理解为方法名
    imp:实现这个方法的函数
    types:一个定义该函数返回值类型和参数类型的字符串
 
 */
-(void)oneParam{
    
    CustomClass *objectText = [[CustomClass alloc]init];
    
    //方法添加
    class_addMethod([CustomClass class],@selector(ocMethod:), (IMP)cfunction,"i@:@");

    if ([objectText respondsToSelector:@selector(ocMethod:)]) {
        
        NSLog(@"Yes, objectText respondsToSelector:@selector(ocMethod:)");

    }else{
        NSLog(@"sorry");
    }
    int a = (int)[objectText ocMethod:@"我是一个OC的method,C函数实现"];
    NSLog(@"a:%d", a);
    
}
#warning c方法
int cfunction(id self, SEL _cmd, NSString *str) {
    NSLog(@"---%@", str);
    return 10;//随便返回个值
}


-(void)twoParam{
    
    CustomClass *objectText = [[CustomClass alloc]init];
    class_addMethod([CustomClass class], @selector(ocMethodA::), (IMP)cfunction2, "i@:@@");
    if ([objectText respondsToSelector:@selector(ocMethodA::)]) {
        NSLog(@"yes");
    }else{
        
        NSLog(@"no");
    }

    int num = (int) [objectText ocMethodA:@"第一参数":@"第二个参数"];
    NSLog(@"a:%d", num);

}

int cfunction2(id self, SEL _cmd ,NSString *str,NSString *str1){
    
    NSLog(@"%@ %@",str,str1);
    
    return 20;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值