美文网首页
iOS 2019年1月学习记录

iOS 2019年1月学习记录

作者: quantiza | 来源:发表于2019-02-21 10:09 被阅读0次
    1. NSLog效率低下的原因(http://blog.sunnyxx.com/2014/04/22/objc_dig_nslog/
      image.png
    • NSLog被设计为error log,是ASL的高层封装
    1. OS 中集合遍历方法(http://blog.sunnyxx.com/2014/04/30/ios_iterator/

      image.png
      可读性效率相权衡
    2. atomic一定是线程安全的吗?
      atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的。如下列所示:
      比如:@property(atomic,strong)NSMutableArray *arr;
      如果一个线程循环的读数据,一个线程循环写数据,那么肯定会产生内存问题,因为这和setter、getter没有关系。如使用[self.arr objectAtIndex:index]就不是线程安全的。好的解决方案就是加锁。

    3. 已经有了__weak 为什么还要保留 __unsafe_unretained ?
      __unsafe_unretained 主要跟 C 代码交互,对象即使被销毁,指针也不会自动置空(set nil)。另外 __weak 是有代价的,需要检查对象是否已经消亡,而为了知道是否已经消亡,自然也需要一些信息去跟踪对象的使用情况。__unsafe_unretained 比 __weak 快。当明确知道对象的生命期时,选择 __unsafe_unretained 会有一些性能提升。当 A 拥有 B 对象,当 A 消亡时 B 也消亡。这样当 B 存在,A 就一定会存在。而 B 又要调用 A 的接口时,B 就可以存储 A 的 __unsafe_unretained 指针。比如 MyViewController 拥有 MyView, MyView 需要调用 MyViewController 的接口。MyView 中就可以存储 __unsafe_unretained MyViewController* _viewController。

    4. Heap-Stack Dance 避开循环引用

    5. ARC怎么知道生成的对象是不是autorelease的呢?(http://blog.sunnyxx.com/2014/03/15/objc_arc_secret/

    • Method family :指的是命名上表示一类型的方法,比如- init和- initWithMark:都属于init的family
      于是乎,编译器约定,对于alloc,init,copy,mutableCopy,new这几个家族的方法,后面默认加NS_RETURNS_RETAINED标识;而其他不指名标识的family的方法默认添加NS_RETURNS_NOT_RETAINED标识。如下:
      @interface Sark : NSObject
      + (instancetype)sarkWithMark:(NSString *)mark NS_RETURNS_NOT_RETAINED; // 1
      - (instancetype)initWithMark:(NSString *)mark NS_RETURNS_RETAINED; // 2
      @end
      

    于是sarkWithMark返回一个autorelease对象,init返回一个

    1. dealloc过程的解释


      image.png
    2. Autorelease相关问题
      8.0 Autorelease原理
      a) Autorelease是一种内存自动管理方案,@autoreleasepool{}。
      b) AutoreleasePoolPage双向链表用以实现pool结构,在push时加入哨兵对象。
      c) 释放时从哨兵对象开始到next指针的所有对象都接收release消息。
      8.1 Autorelease对象什么时候释放?
      在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的
      8.2 Autorelease返回值的快速释放机制
      a) Thread Local Storage(TLS)线程局部存储
      b) 举例 objc_autoreleaseReturnValue方法时,runtime将这个返回值object储存在TLS中;objc_retainAutoreleasedReturnValue里,发现TLS中正好存了这个对象,那么直接返回这个object

      + (instancetype)createSark {
          return [self new];
      }
      // caller
      Sark *sark = [Sark createSark];
      
      //编译器翻译
      + (instancetype)createSark {
      id tmp = [self new];
      return objc_autoreleaseReturnValue(tmp); // 代替我们调用autorelease
      }
      // caller
      id tmp = objc_retainAutoreleasedReturnValue([Sark createSark]) // 代替我们调用retain
      Sark *sark = tmp;
      objc_storeStrong(&sark, nil); // 相当于代替我们调用了release
      

      8.3 应用举例
      a) [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { // 这里被一个局部@autoreleasepool包围着 }];

    3. 预编译宏的用法

    4. reflection (https://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful)

      image.png

    相关文章

      网友评论

          本文标题:iOS 2019年1月学习记录

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