iOS + 优秀博文

  1. 综合
    ibireme的技术博客
    Jamin's BLOG
    Sunny的技术博客
    MrPeak杂货铺
    Holko.pl
    Casa Taloyum
    ObjC_中国_期刊
    一名全栈设计师的Mac工具箱
    Github-iOS备忘 :分好类且很全的第三方库,原地址
    iOS/React/Swift/React Native的一点心得

  2. runloop & block
    深入理解runloop或者点这
    objc 中的 block
    Objective-C Runtime 1小时入门教程:runtime的基本概念,易懂幽默,代码beautiful
    Method Swizzling
    利用Objective-C运行时hook函数的三种方法
    如何自己动手实现 KVO
    谈谈 KVO

  3. UI篇及性能优化
    『有趣的 Layer』CAGradientLayer 与 mask
    iOS 内存泄漏监测自动化
    内存恶鬼drawRect - 谈画图功能的内存优化
    如何正确地写好一个界面
    iOS 保持界面流畅的技巧:性能优化建议
    iOS应用UI线程卡顿监控

    原理:每隔一段时间检测一次
       1. 在UI线程空闲的时候发送开始检测通知
       2. worker线程收到检测通知时,隔一帧的时间在UI线程发送检测结束通知,并设置超时处理
       3. 如果一帧时间内收到检测结束通知,则说明此时UI线程空闲,不卡顿
       4. 如果超时,则说明UI线程在忙,暂停UI线程,打印调用栈信息,随后UI线程继续运行
    

    iOS Core Animation: Advanced Techniques中文译本
    iOS UILabel复制粘贴效果
    iOS中UIWebView与WKWebView、JavaScript与OC交互、Cookie(上)
    iOS中UIWebView与WKWebView、JavaScript与OC交互、Cookie(中)
    iOS中UIWebView与WKWebView、JavaScript与OC交互、Cookie(下)
    iOS设备参数

    iOS + 优秀博文_第1张图片
    ios设备

  1. 数据
    sqlite
    iOS集合的深复制与浅复制
    认识CoreData—初识CoreData
    认识CoreData—基础使用
    认识CoreData—使用进阶

  2. 架构
    iOS应用架构谈 开篇
    杂谈: MVC/MVP/MVVM
    设计模式:虽然是java的,但也可以借鉴
    MVVM 介绍
    ReactiveCocoa入门教程:第一部分
    从NSArray看类簇

  3. 网络篇
    AFNetworking到底做了什么?
    AFNetworking与ASIHTTPRequest的区别
    NSURLSession与NSURLConnection区别
    iOS开发中的HTTPS
    iOS安全系列之一:HTTPS
    关于iOS socket都在这里了
    cookie (储存在用户本地终端上的数据)

  4. 调试
    iOS开发调试技巧总结
    熟练使用 LLDB,让你调试事半功倍:详细介绍了lldb的相关命令

  5. 算法
    常用排序算法总结(一):C、图示
    常用排序算法总结(二)
    排序算法总结:java
    八大排序算法:C++
    算法书:剑指 offer、编程之美

  6. 多线程
    关于iOS多线程,你看我就够了

  7. 编译
    iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a

  8. 面试
    iOS 中级面试题
    一份"有点难"的iOS面试题
    让 BAT 的 Offer 不再难拿
    招聘靠谱的iOS程序员

  9. 其他
    向iOS开发者介绍C++(一)
    向iOS开发者介绍C++(二)
    iOS 自带地图(MapKit、MKMapView)轨迹渐变
    iOS原生地图MKMapView添加半透明遮盖物和轨迹起点、终点等自定义annotation
    [React Native]从源码一步一步解析它的实现原理
    iOS开发系列文章(持续更新……)

  10. 总结与笔记

    1. 分类:能声明属性,但不会自动生成_xxx变量,也不会自动实现get、set方法,需手动实现

    2. imageNamed:苹果解释:第一次使用到图片时从本地加载图片并缓存,缓存由系统控制,随时可能清除缓存以便释放内存,但只会释放那些当前没使用的图片

    3. id & class 笔记

      // id 为实例对象指针
      typedef struct objc_object *id;
      struct objc_object {
            // id 对象 的 isa 指针指向类对象,
            // 类对象里面存储相关的成员对象、成员方法等
            Class isa  OBJC_ISA_AVAILABILITY;
      };
      
      // class 为类对象指针
      typedef struct objc_class *Class;
      struct objc_class { 
          // d 对象 的 isa 指针指向metaclass,类对象里面存储相关的类对象、类方法等
      
          // metaclass
          Class isa                                 OBJC_ISA_AVAILABILITY; 
          #if !__OBJC2__
          // 父类
          Class super_class                         OBJC2_UNAVAILABLE; 
      
          // 类名
          const char *name                          OBJC2_UNAVAILABLE; 
      
          // 类的版本信息,默认为0,可以通过runtime函数class_setVersion或者class_getVersion进行修改、读取
          long version                              OBJC2_UNAVAILABLE; 
      
          // 类信息,供运行时期使用的一些位标识,如CLS_CLASS (0x1L) 表示该类为普通 class,其中包含实例方法和变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;
          long info                                 OBJC2_UNAVAILABLE; 
      
          // 该类的实例变量大小(包括从父类继承下来的实例变量)
          long instance_size                        OBJC2_UNAVAILABLE; 
      
          // 该类的成员变量地址列表
          struct objc_ivar_list *ivars              OBJC2_UNAVAILABLE; 
      
          // 方法地址列表,与 info 的一些标志位有关,如CLS_CLASS (0x1L),则存储实例方法,如CLS_META (0x2L),则存储类方法;
          struct objc_method_list **methodLists     OBJC2_UNAVAILABLE;
      
          // 缓存最近使用的方法地址,用于提升效率;
          struct objc_cache *cache                  OBJC2_UNAVAILABLE; 
      
          // 存储该类声明遵守的协议的列表
          struct objc_protocol_list *protocols      OBJC2_UNAVAILABLE; 
          #endif
      }
      
      1. objc_object(实例对象)中isa指针:指向的类结构称为class(即该对象所属的类)
         其中存放着普通成员变量与动态方法(“-”开头的方法)
      2. objc_class(元类)中的isa指针:指向的类结构称为metaclass,
         其中存放着static类型的成员变量与static类型的方法(“+”开头的方法)
      3. 获取对象的类:object_getClass(obj) 或 [obj class]
      4. 获取类的metaClass: objc_getMetaClass("className");
      5. 修改obj的isa指针:object_setClass(obj, class)
      
    4. Method Swizzling笔记

      #import "UIViewController+swizze.h"
      #import 
      #import 
      @implementation UIViewController (swizze)
      /*
       相关概念
      1. Selector(SEL):函数的唯一标识,在运行时根据方法的名字、参数序列生成的C字符串。
      2. Implementation(IMP):函数的实现入口指针
      3. Method:Selector和Implementation的绑定
      4. 三者联系:Class维护一个消息分发列表,每个消息列表的入口是一个Method,Method映射一对键值对,value是SEL,key是IMP。
      5. swizzling原理: 修改了类的消息分发列表,将已有的方法和自定义方法的IMP进行交换,即交换两方法的实现入口指针;
      */
      
      + (void)load {
           static dispatch_once_t onceToken;
           dispatch_once(&onceToken, ^{
               Class class = [self class];
           
               SEL originalSelector = @selector(viewWillAppear:);
               SEL swizzledSelector = @selector(xxx_viewWillAppear:);
           
               // 获取成员方法
               Method originalMethod = class_getInstanceMethod(class, originalSelector);
               Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
           
               // 获取类方法(修改类方法时用这个)
               // When swizzling a class method, use the following:
               // Class class = object_getClass((id)self);
               // ...
               // Method originalMethod = class_getClassMethod(class, originalSelector);
               // Method swizzledMethod = class_getClassMethod(class, swizzledSelector);
           
               // 1.1 添加原始方法SEL的IMP,
               // 若成功,说明之前就没有该方法;
               // 失败,则说明方法之前已经存在
               BOOL didAddMethod = class_addMethod(class, originalSelector,
                                               method_getImplementation(swizzledMethod),
                                               method_getTypeEncoding(swizzledMethod));
               if (didAddMethod) {
                   // 1.2 修改自定义方法的IMP
                   class_replaceMethod(class,swizzledSelector,
                                   method_getImplementation(originalMethod),
                                   method_getTypeEncoding(originalMethod));
               } else {
                   // 2.0 或交换两方法的IMP
                   method_exchangeImplementations(originalMethod, swizzledMethod);
               }
           });
       }
      
       // 自定义的方法
       - (void)xxx_viewWillAppear:(BOOL)animated {
           [self xxx_viewWillAppear:animated];
           NSLog(@"viewWillAppear: %@", self);
       }
       @end

你可能感兴趣的:(iOS + 优秀博文)