iOS 内存管理(一)

    前言

        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 内存管理(一))