• ios高级开发,runtime(三)


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

    - (void) methodExchange {

        

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

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

            method_exchangeImplementations(m1, m2);

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

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

    }

     

    运行结果:

    2014-10-20 14:48:17.584 runtimetest[14921:303] AAAAAAAA

    2014-10-20 14:48:17.586 runtimetest[14921:303] aaaaaaaa

    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 ");

        NSString *string = cFuncPointer(self,_cmd);

        return string;

    }

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

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

        return cFuncPointer1(self,_cmd, str);

    }

    //不起作用,求解释

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

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

        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;

    }

     

     

  • 相关阅读:
    吴恩达机器学习16:多变量线性回归(特征值以及多项式回归)
    吴恩达机器学习15:多变量线性回归(梯度下降运算中的实用技巧)
    吴恩达机器学习14:梯度下降以及平方差代价函数
    吴恩达机器学习13:多变量线性回归(使用梯度下降来求解多变量)
    吴恩达机器学习11:线性回归和多变量
    用通俗易懂的大白话讲解Map/Reduce原理
    漫画揭秘Hadoop MapReduce | 轻松理解大数据
    Pom.xml详解
    maven详细配置
    配置hadoop-eclipse-plugin(版本hadoop2.7.3):
  • 原文地址:https://www.cnblogs.com/q403154749/p/4037269.html
Copyright © 2020-2023  润新知