Runtime(三)
2016-04-12 21:59
459 查看
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;
}
- (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;
}
相关文章推荐
- Java Runtime Environment 5.0 Update 12 下载
- php set_magic_quotes_runtime() 函数过时解决方法
- Asp.Net 程序错误Runtime Error原因与解决
- iOS开发之路--微博“更多”页面
- System 类 和 Runtime 类的常用用法介绍
- iOS开发之路--微博骨架搭建
- iOS开发使用JSON解析网络数据
- IOS开发代码分享之获取启动画面图片的string
- iOS开发实现音频播放功能
- iOS开发使用XML解析网络数据
- IOS开发实现录音功能
- IOS开发之路--C语言数组和字符串
- IOS开发代码分享之用nstimer实现倒计时功能
- iOS开发使用GDataXML框架解析网络数据
- NET Runtime Optimization Service 1101 错误的解决方法
- IOS开发代码分享之设置UISearchBar的背景颜色
- 自动释放池的前世今生 ---- 深入解析 autoreleasepool
- 深入解析 ObjC 中方法的结构
- 你真的了解 load 方法么?
- 从源代码看 ObjC 中消息的发送