美文网首页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