11、系统类的方法实现部分替换

- (void) methodExchange {

Method m1 = class_getInstanceMethod([NSStringclass],@selector(lowercaseString));

Method m2 = class_getInstanceMethod([NSStringclass],@selector(uppercaseString));

method_exchangeImplementations(m1, m2);

NSLog(@"%@", [@"sssAAAAss"lowercaseString]);

NSLog(@"%@", [@"sssAAAAss"uppercaseString]);

}

打印结果:(仔细看log)

2013-07-26 16:33:22.776 HighOC[7104:c07] SSSAAAASS

2013-07-26 16:33:22.778 HighOC[7104:c07] sssaaaass

12、自定义类的方法实现部分替换

- (void) justLog1 {

NSLog(@"justLog1");

}

- (void) justLog2 {

NSLog(@"justLog2");

}

- (void) methodSetImplementation {

Method method =
class_getInstanceMethod([ClassMethodViewCtrclass],@selector(justLog1));

IMP originalImp = method_getImplementation(method);

Method m1 = class_getInstanceMethod([ClassMethodViewCtrclass],@selector(justLog2));

method_setImplementation(m1, originalImp);

}

//[self methodSetImplementation];

//[self justLog2];

13、覆盖系统方法

IMP cFuncPointer;

IMP cFuncPointer1;

IMP cFuncPointer2;

NSString* CustomUppercaseString(idself,SEL_cmd){

printf("真正起作用的是本函数CustomUppercaseString\r\n");

NSString *string = cFuncPointer(self,_cmd);

return string;

}

NSArray* CustomComponentsSeparatedByString(idself,SEL_cmd,NSString *str){

printf("真正起作用的是本函数CustomIsEqualToString\r\n");

return cFuncPointer1(self,_cmd, str);

}

//不起作用,求解释

bool CustomIsEqualToString(idself,SEL_cmd,NSString *str) {

printf("真正起作用的是本函数CustomIsEqualToString\r\n");

return cFuncPointer2(self,_cmd, str);

}

- (void) replaceMethod{

cFuncPointer = [NSStringinstanceMethodForSelector:@selector(uppercaseString)];

class_replaceMethod([NSStringclass],@selector(uppercaseString), (IMP)CustomUppercaseString,"@@:");

cFuncPointer1 = [NSStringinstanceMethodForSelector:@selector(componentsSeparatedByString:)];

class_replaceMethod([NSStringclass],@selector(componentsSeparatedByString:), (IMP)CustomComponentsSeparatedByString,"@@:@");

cFuncPointer2 = [NSStringinstanceMethodForSelector:@selector(isEqualToString:)];

class_replaceMethod([NSStringclass],@selector(isEqualToString:), (IMP)CustomIsEqualToString,"B@:@");

}

14、自动序列化(转)

#import "NSObject+AutoEncodeDecode.h"

@implementation NSObject (AutoEncodeDecode)

- (void)encodeWithCoder:(NSCoder *)encoder {

Class cls = [selfclass];

while (cls != [NSObjectclass]) {

unsigned int numberOfIvars =0;

Ivar* ivars = class_copyIvarList(cls, &numberOfIvars);

for(const
Ivar* p = ivars; p < ivars+numberOfIvars; p++){

Ivar const ivar = *p;

const char *type =ivar_getTypeEncoding(ivar);

NSString *key = [NSStringstringWithUTF8String:ivar_getName(ivar)];

id value = [selfvalueForKey:key];

if (value) {

switch (type[0]) {

case _C_STRUCT_B: {

NSUInteger ivarSize =0;

NSUInteger ivarAlignment =0;

NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);

NSData *data = [NSDatadataWithBytes:(constchar *)self +
ivar_getOffset(ivar)

length:ivarSize];

[encoder encodeObject:dataforKey:key];

}

break;

default:

[encoder encodeObject:value

forKey:key];

break;

}

}

}

free(ivars);

cls = class_getSuperclass(cls);

}

}

- (id)initWithCoder:(NSCoder *)decoder {

self = [self
init];

if (self) {

Class cls = [selfclass];

while (cls != [NSObjectclass]) {

unsigned int numberOfIvars =0;

Ivar* ivars =
class_copyIvarList(cls, &numberOfIvars);

for(constIvar* p = ivars; p < ivars+numberOfIvars; p++){

Ivar const ivar = *p;

const char *type =ivar_getTypeEncoding(ivar);

NSString *key = [NSStringstringWithUTF8String:ivar_getName(ivar)];

id value = [decoder
decodeObjectForKey:key];

if (value) {

switch (type[0]) {

case
_C_STRUCT_B: {

NSUInteger ivarSize =0;

NSUInteger ivarAlignment =0;

NSGetSizeAndAlignment(type, &ivarSize, &ivarAlignment);

NSData *data = [decoderdecodeObjectForKey:key];

char *sourceIvarLocation = (char*)self+ivar_getOffset(ivar);

[data getBytes:sourceIvarLocationlength:ivarSize];

}

break;

default:

[self
setValue:[decoder decodeObjectForKey:key]

forKey:key];

break;

}

}

}

free(ivars);

cls = class_getSuperclass(cls);

}

}

return self;

}

IOS高级开发~Runtime(一)

http://blog.csdn.net/zfpp25_/article/details/9496705

IOS高级开发~Runtime(二)

http://blog.csdn.net/zfpp25_/article/details/9497187

IOS高级开发~Runtime(三)

http://blog.csdn.net/zfpp25_/article/details/9497721

IOS高级开发~Runtime(四)

http://blog.csdn.net/zfpp25_/article/details/9498233

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

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

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

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

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

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

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

  4. iOS 高级开发 runtime(三)

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

  5. IOS高级开发 runtime(一)

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

  6. IOS 高级开发 runtime(二)

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

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

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

  8. ios高级开发之多线程(三)GCD技术

    GCD是基于C的API,它是libdispatch的的市场名称.而libdispatch作为Apple公司的一个库,为并发代码在多核硬件(跑IOS或者OS X)上执行提供有力支持. 那么我们为什么要用 ...

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

    #import <Foundation/Foundation.h> @interface CustomClass : NSObject -(void)fun1; @end @interfa ...

随机推荐

  1. AcDbDictionary of AcDbDatabase

    GroupDictionary MLStyleDictionary LayoutDictionary PlotStyleNameDictionary MaterialDictionary Visual ...

  2. 剑指Offer的学习笔记(C#篇)-- 替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 一 . 自己的想法 老实说,貌 ...

  3. 内置对象(Math对象、Date对象、Array对象、String对象)常用属性和方法

    Math对象 Math 是一个内置对象, 它具有数学常数和函数的属性和方法.不是一个函数对象. 与其它全局对象不同的是, Math 不是一个构造函数.  Math 的所有属性和方法都是静态的. 跟数学 ...

  4. Jquery属性操作(入门二)

    ********JQuery属性相关的操作******** 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个 ...

  5. Hive进阶_Hive数据的导入

    使用Load语句执行数据的导入 语法: load data [local] inpath 'filepath' [overwrite] into table tablename [partition ...

  6. 基于.NetCore2.1。服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务

    基于.NetCore2.1.服务类库采用.Net Standard2.0,兼容.net 4.6.1消息推送服务 https://www.cnblogs.com/ibeisha/p/weixinServ ...

  7. FusionCharts的类 - 实例功能

    一.FusionCharts的类 - 实例功能 1.configure(name:string , value:string)  or  configure(configurations: Objec ...

  8. 类成员函数的重载、覆盖和隐藏区别 (C++)

    这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载.覆盖和隐藏区别,第一次看到这个问题是在准备找工作的 ...

  9. nodejs 实践:express 最佳实践(五) connect解析

    nodejs 实践:express 最佳实践(五) connect解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需 ...

  10. windows下利用intellij idea等工具开发erlang

    今天突然想在家里去年新买的电脑上写点erlang代码,然后可耻的发现家里的电脑上竟然没有开发环境,果然是去年6月以后没写过erlang代码么╮(╯▽╰)╭?        首先下载需要用的几样东西:  ...