iOS开发小知识笔记

作者: _小迷糊_997 | 来源:发表于2018-04-18 21:16 被阅读755次

    1 @property

    • @property 是 readwrite,assign,atomic

    • 在使用 @property 时, 编译器默认会进行自动 synthesize,生成 getter 和 setter,同时把 ivar 和属性绑定起来

    • 使用 @dynamic,显式表示不希望编译器生成 getter 和 setter

    • protocol 中定义的属性,编译器不会自动 synthesize,需要手动写

    • 当重载父类中的属性时,也必须手动写 synthesize

    2 Extension 与 Category 有如下几点显著的区别:

    • 使用 Extension 必须有原有类的源码

    • Extension 声明的方法必须在类的主 @implementation 区间内实现,可以避免使用有名 Category 带来的多个不必要的 implementation 段。

    • Extension 可以在类中添加新的属性和实例变量,Category 不可以(注:在 Category 中实际上可以通过运行时添加新的属性,下面会讲到)

    3 Bolck

    • 在 ARC 中编译器会自动对 block 进行 copy 操作,但是苹果仍然建议使用 copy 来指明编译器的行为

    • block 在捕获外部变量的时候,会保持一个强引用,当在 block 中捕获 self 时,由于对象会对 block 进行 copy,于是便形成了强引用循环

    • 多次调用 weakSelf 的方法,有可能在 block 执行过程中 weakSelf 变为 nil,

    涉及到 weak 本身的机制了。weak 置 nil 的操作发生在 dealloc 中

    最后一个持有 object 的对象被释放的时候,会触发对象的 dealloc,而这个持有者的释放操作就不一定保证发生在哪个线程了。因此 block 执行的过程中 weakSelf 有可能在另外的线程中被置为 nil。

    • MRC 下Block 默认是分配在栈上的,除非进行显式的 copy

    • ARC 也更加倾向于把 Block 放到堆上

    Block进阶

    • Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock

    参考资料http://blog.devtang.com/2013/07/28/a-look-inside-blocks/

    4 堆和栈

    • 堆内存要程序员手动回收(动态分配和回收内存的)

    • 栈内存会被系统自动回收(静态分配和动态分配)

    静态分配是系统编译器完成的,比如局部变量的分配

    动态分配是由alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要程序员手动管理

    只有oc对象需要进行内存管理

    1. 非oc对象类型比如基本数据类型不需要进行内存管理

    2. 栈是向低地址扩展的数据结构,是一块连续的内存的区域。

    3. 堆是向高地址扩展的数据结构,是不连续的内存区域。(堆是链表方式存储)

    两者区别

    1. 管理方式不同;(栈:自动 堆:手动)

    2. 空间大小不同;( 栈:1M?? 32位系统 堆4G )

    3. 能否产生碎片不同;(栈:后进先出 堆:频繁new release 大量的碎片使程序效率变低)

    4. 生长方向不同;(栈: 生长方向是向下的,是向着内存地址减小的方向增长 堆:相反)

    5. 分配方式不同;(栈:静态和动态 堆:全动态)

    6. 分配效率不同;(栈:机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高. 堆:C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆 内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分 到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。)

    iOS开发小知识笔记

    栈和堆

    iOS开发小知识笔记
    需要了解更多的可以加入小编的交流群:656315826,会可以给你提供一些有关方面的资料帮助哦。

    相关文章

      网友评论

      本文标题:iOS开发小知识笔记

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