最近在研究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