美文网首页功能优化
iOS 内存管理(一)

iOS 内存管理(一)

作者: Damon_Rao | 来源:发表于2019-06-01 17:16 被阅读0次

        前言

            iOS开发中,内存管理是从来都不能忽视的问题,OC采用的是动态内存管理方式,跟踪每个对象被引用的次数,当对象引用次数为0时,则释放对象占用的内存。引用计数分为自动和手动计数(retain 引用、release释放,autorelease 废弃),在此我主要对自动引用计数做相关的分享。

    自动引用计数

            自动引用计数顾名思义是自动计数管理,是编译器在编译过程中自动添加retain、release来确保对象被释放(注:arc 只能管理oc的对象,不能管理通过malloc申请的内存)并利用@autoreleasepool代替NSAutoreleasePool。

            首先让我们先了解下内存管理的思维方式:

            自己生成的对象,自己持有

            非自己生成的对象,自己持有

            不再需要自己持有的对象时释放

            非自己持有的对象不能释放

            了解了思维方式,那么怎么去生成并持有对象呢,在OC中有多种方法族大家并不陌生,用于初始化并持有对象,分别是alloc/new/copy/mutableCopy。另 init 方法族:以init 开头的方法必须被定义为实例方法,它一定要返回id 类型或父类、子类的指针;其他族可以是类方法也可以是实例方法。另 所有权声明 是通过 _ _strong(强引用,ARC中默认)、_ _weak(弱引用,常用于防止循环引用)、_ _unsafe_unretained(iOS 5下相当于weak)、_ _autoreleasing (自动释放池所用,id/对象  另加 星 * 类型变量 默认)。

            引用计数表,在OC 中采用hash表来管理引用计数表键值为内存块地址;这样对象内存块就无需考虑头部了,直接通过引用计数表的内存块地址就可以找到对象内存块。

    ARC规则

         在ARC中有一些规则必须遵守否则会警告甚至引起程序崩溃

            1、不能使用retain/release/retainCount/autorelease

                arc 中内存由编译器控制,不必使用上述内存管理方法

             2、不能使用NSAllocateObject/NSDeallocateObject

             3、必须遵守内存管理方法命名规则 alloc/new/copy/mutableCopy/init

             4、不可显示调用dealloc,不能使用NSZone

             5、使用@autoreleasepool块代替NSAutoreleasePool

             6、对象型变量不能作为C语言结构体的成员

             7、显示转换id 和void  如 id obj =[NSObject alloc] init]; void *p =(_ _bridge void *)obj  

    属性

            1、property 指一个对象的属性或特性        

            2、@synthesize :自动生成getter、setter方法;@dynamic 告诉编译器要自己手动实现        getter、setter

            3、给属性指定选项

    注:默认为 atomic ,必须要用lock unlock 保证属性的线程安全,如果不是频繁的使用且不考虑多线程的话,尽量用noatomic

    一些记录点:

    1、arc 的实现 是通过clang 编译器 和objc 运行时库结合进行内存管理

    2、引用计数获取方法: _objec_rootRetainCount(id obj)

    3、strong 与 retain 在 block 下,strong相当于copy ,retain 相当于 assign 

    4、在block 里使用外部变量或对象的时候,用__blcok 修饰时实质是指针拷贝

    5、GC 垃圾回收机制  只支持 mac os

    参考:

    1、Apple Open Source : http://opensource.apple.com

    2、Apple library : http://developer.apple.com/library/ios

    相关文章

      网友评论

        本文标题:iOS 内存管理(一)

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