#import <Foundation/Foundation.h>

@interface CustomClass : NSObject

-(void)fun1;

@end

@interface CustomOtherClass : NSObject

-(void)fun2;

@end
#import "TestClass.h"
#import <objc/runtime.h>
@implementation TestClass + (BOOL)resolveInstanceMethod:(SEL)sel {
Method exchangeM = class_getInstanceMethod([self class], @selector(eatWithPersonName:));
//拿到IMP指针
class_addMethod([self class], sel, class_getMethodImplementation(self, @selector(eatWithPersonName:)),method_getTypeEncoding(exchangeM));
return YES;
}
- (void)eatWithPersonName:(NSString *)name {
NSLog(@"Person %@ start eat ",name);
}
@end

/**

对象拷贝

*/

-(void)copyObj{

CustomClass *obj = [CustomClass new];

NSLog(@"对象拷贝:%p",&obj);

//完全是一个新的对象

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

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

[objTest fun1];

}

/**

对象释放

*/

-(void)objectDispose{

CustomClass *obj = [CustomClass new];

(void)(NSLog(@"---%ld",obj.retainCount)),

object_dispose(obj);

//(void)(NSLog(@"---%ld",obj.retainCount)),

//[obj release];

//NSLog(@"---%ld",obj.retainCount);

//[obj fun1];

}

/**

更改对象的类

*/

-(void)setClassTest{

CustomClass *obj = [CustomClass new];

[obj fun1];

Class aclass = object_setClass(obj, [CustomOtherClass class]);

//obj 对象的类被更改了    swap the isa to an isa

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

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

[obj fun2];

}

-(void)getClassTest{

CustomClass *obj = [CustomClass new];

Class alogClass = object_getClass(obj);

NSLog(@"--get:%@",NSStringFromClass(alogClass));

}

/**

获取对象的类名

*/

- (void) getClassName{

CustomClass *obj = [CustomClass new];

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

NSLog(@"className:%@",className);

}

/**

动态给一个类添加方法

*/

- (void)oneParam{

TestClass *instance = [[TestClass alloc]init];

//方法添加

[instance performSelector:@selector(eatWithPersonName:) withObject:@"mujin"];

}

IOS高级开发~Runtime(一)的更多相关文章

  1. IOS高级开发 runtime(一)

    一. 简介 IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度.要想使用runtime,首先要引入系统的头文件. <span style="font-size:18p ...

  2. iOS 高级开发 runtime(三)

    三 .动态添加方法 我们可以通过runtime动态地添加方法.那么到底啥叫动态添加方法呢?动态添加方法就是当我们程序运行时才知道我们应该调用哪个方法.我们首先需要了解这一点,当我们编写完一段代码后,我 ...

  3. IOS 高级开发 runtime(二)

    二.移魂大法 使用runtime还可以交换两个函数.先贴上代码和执行结果. #import <Foundation/Foundation.h> @interface DZLPerson : ...

  4. (转发)IOS高级开发~Runtime(四)

    用C代替OC: #import <objc/runtime.h> #import <objc/message.h> #import <stdio.h> extern ...

  5. (转发)IOS高级开发~Runtime(三)

    11.系统类的方法实现部分替换 - (void) methodExchange { Method m1 = class_getInstanceMethod([NSStringclass],@selec ...

  6. (转发)IOS高级开发~Runtime(二)

    一些公用类: @interface ClassCustomClass :NSObject{ NSString *varTest1; NSString *varTest2; NSString *varT ...

  7. (转发)IOS高级开发~Runtime(一)

    IOS高级开发-Runtime(一) IOS高级开发-Runtime(二) IOS高级开发-Runtime(三) IOS高级开发-Runtime(四) 一些公用类: @interface Custom ...

  8. IOS高级开发之多线程(四)NSOperation

    1.什么是NSOperation,NSOperationQueue? NSOperation是一个抽象的基类,表示一个独立的计算单元,可以为子类提供有用且线程安全的建立状态,优先级,依赖和取消等操作. ...

  9. IOS高级开发~Runtime(二)

    #import <Foundation/Foundation.h> @interface CustomClass : NSObject { NSString *varTest1; NSSt ...

随机推荐

  1. VC++_错误 无法打开包括文件“glglut.h” No such file or directory 怎么办

    在网上看到类似的问题,查找资料找到了解决方案,现整理如下,有些更改,好让自己多些印象,附原文网址:http://blog.csdn.net/bigloomy/article/details/62265 ...

  2. poj 2828 Buy Tickets 【线段树点更新】

    题目:id=2828" target="_blank">poj 2828 Buy Tickets 题意:有n个人排队,每一个人有一个价值和要插的位置,然后当要插的位 ...

  3. salt.states.file试用

    从master往linux上的minion复制文件参考http://netkiller.sourceforge.net/linux/management/saltstack.html后半部分,他已经写 ...

  4. DTD笔记

    DTD(Document Type Definition)文档类型定义: DTD被用于定义XML文档的结构,作为规范XML文档的一种内容模型,DTD在各领域已形成统一规范的文档. 在XML文档中使用D ...

  5. php利用cookie防止重复提交解决办法

    原理:如果数据通过了上边的两次验证,说明数据是合法有效的数据,这时候我们把提交的数据串接为一个字符串,并用MD5加密后得到一个MD5的值. 接着我们把这个值通过Cookie放进客户端,当用户下一次提交 ...

  6. java的nio包的SelectionKey,Selector,SelectableChannel三者的缠绵关系概述

    猛击这里 java的nio包的SelectionKey,Selector,SelectableChannel三者的缠绵关系概述

  7. BootStrap-DualListBox怎样改造成为双树

    BootStrap-DualListBox能够实现将所选择的列表项显示到右边,未选的列表项显示到左边. 但是左右两边的下拉框中都是单级列表.如果要实现将两边都是树(缩进树),选择某个节点时,其子节点也 ...

  8. NIO原理图

  9. 数据库连接池-配置 wallfilter问题解决-UncategorizedSQLException

    wallFilter对sql有着严格的校验,会对有风险的sql过滤,抛出异常信息: org.springframework.jdbc.UncategorizedSQLException: ### Er ...

  10. Java中需要了解的点

    1.32位jvm.64位区别? 2.