美文网首页iOS Developer
Effective Objective-C读后笔记(2)

Effective Objective-C读后笔记(2)

作者: dispath_once | 来源:发表于2017-06-20 22:53 被阅读11次

    11、runtime消息转发机制

    • runtime的消息转发流程图


      消息转发
    • 消息转发的示例


      实现
    • 这里也给大家推荐一篇比较好的runtime文章。

    12、runtime的方法交换&便利归档和解档

    • 方法交换实现
      + (void)swizzlingInClass:(Class)cls originalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector {
        Class clzz = cls;
        Method originalMethod = class_getInstanceMethod(clzz, originalSelector);
        Method swizzMethod = class_getInstanceMethod(clzz, swizzledSelector);
        BOOL didAddMethod = class_addMethod(clzz, originalSelector, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
        if (didAddMethod) {
            NSLog(@"replace方法成功");
            class_replaceMethod(clzz, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        }
        else {
            NSLog(@"交换方法成功");
            method_exchangeImplementations(originalMethod, swizzMethod);
        }
    }
    
    • 自动归档&解档
     - (void)encodeWithCoder:(NSCoder *)aCoder {
       unsigned int count = 0;
       Ivar *ivars = class_copyIvarList([People class], &count);
       for (NSUInteger i = 0; i < count; i ++) {
           Ivar ivar = ivars[i];
           const char *name = ivar_getName(ivar);
           NSString *key = [NSString stringWithUTF8String:name];
           id value = [self valueForKey:key];
           [aCoder encodeObject:value forKey:key];
       }
       free(ivars);
    }
     - (id)initWithCoder:(NSCoder *)aDecoder {
       self = [super init];
       if (self) {
           unsigned int count = 0;
           Ivar *ivars = class_copyIvarList([People class], &count);
           for (NSUInteger i = 0; i < count; i ++) {
               Ivar ivar = ivars[i];
               const char *name = ivar_getName(ivar);
               NSString *key = [NSString stringWithUTF8String:name];
               id value = [aDecoder decodeObjectForKey:key];
               [self setValue:value forKey:key];
           }
           free(ivars);
       }
       return self;
    }
    

    13、为自己创建的类提供全能初始化方法

    • 不管类里面有多少个初始化方法,最终会指向一个全能初始化方法。
    • 如果子类和父类的全能初始化方法不一样,就要覆写父类的初始化方法。
    • 如果父类的初始化方法不适用于子类,需要把父类的初始化方法覆写,然后抛出异常。

    14、尽可能的实现description方法

    • 实现description方法,返回一个对该实例对象具有描述意义的字符串。

    15、对象尽量为不可变

    • 对象创建尽可能为不可变的。
    • 对象对外暴露的属性尽可能是readonly属性,在对象内部如果要进行修改就在内部把属性修改成readwrite属性。

    16、Objective-C里面的错误处理

    • 一般只会在发生严重错误的时候才抛出异常,终止程序。
    • 正常情况下我们只需要抛出普通的错误信息,使程序能正常处理普通的错误信息,而不至于让程序崩溃。

    17、NSCopying协议的理解

    • 浅拷贝:只拷贝对象自身,底层的数据并不会进行拷贝;深拷贝:对象自身和底层数据都进行了一次拷贝。


      浅拷贝和深拷贝区别
    • 自定义对象如果要实现拷贝功能就需要实现NSCopying协议。

    18、Objective-C里面的委托

    • 委托的内存修饰使用weak,委托的命名方式一般使用“驼峰命名”的方式进行命名。
    • 多次判断委托方法是否实现可以使用flag进行标识,以便不用多次进行判断。

    19、“大类”通过分类的方式进行切割

    • 使用分类进行进行类功能模块的分割,使每个分类都是一个小的功能模块。
    • 使用分类机制隐藏不需要公开的使用方法。

    20、第三方分类的管理

    • 尽量为第三方分类添加专用前缀。
    • 尽量为第三方分类里面的方法添加专用的前缀。

    相关文章

      网友评论

        本文标题:Effective Objective-C读后笔记(2)

        本文链接:https://www.haomeiwen.com/subject/ioraqxtx.html