您的位置:首页 > 其它

OC_内存管理笔记

2014-06-09 17:52 190 查看
1.方法的基本使用
 1> retain:计数器+1会返回对象本身
 2> release:计数器-1没有返回值
 3> retainCount:获取当前计数器
 4> dealloc
    *当一个对象要被回收的时候,就会调用
    *一定要调用[super dealloc]这句调用要放在最后面

 
2.基本概念
 1>僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用
 2>野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 3>空指针:没有指向任何东西的指针(存储的东西是nil,NULL,0),给空指针发送消息不报错

 
 3.retain方法会返回对象本身

 
4.多对象内存管理

 1> 你想使用(占用)某个对象,就应该让对象的计数器 +1(让对象做一次retain造作)
 2> 你不想再使用(占用)某个对象,就应该让对象的计数器
-1(让对象做一次release操作)
 3> 谁retain谁release
 4> 谁alloc谁release

5.set方法内存管理

基本数据类型不需要内存管理
1>内存管理代码规范:
 *只要调用了alloc,必须有release(autorelease)
 *基本数据类型不是通过alloc产生的,就不需要release 
2>set方法的代码规范
 *基本数据类型:直接复制
 - (void)setAge:(int)age
 {
    _age = age;
 }

 *OC对象类型
 - (void)setCar:(Car *)car
 {
    // 1.先判断是不是新传入对象
    if (Car !=_car)
    {
        // 2.对就对象做一次release
        [_car release];
     }
        // 3.对新对象做一次retain
        _car = [car retain];
 }
 *dealloc方法的代码规范
 ** 一定要[super dealloc],而且放在最后面
 ** 对self(当前)所拥有的其他对象做一次release
  - (void)dealloc
 {
    [_car release];
    [super dealloc];
 }

6.@property的参数

property里面可以存得参数
 1>set方法内存管理相关的参数
 * retain:release旧值,retain新值(适用于OC对象类型)
 * assign:直接赋值(默认,适用于非对象类型)
 * copy: release旧值,copy新值

 
 2>是否生成set方法
 * readwwrite:同时生成setter和getter的声明,实现(默认)
 * readonly:只会生成getter的声明,实现

 
 3>多线程管理
 * nonatomic:性能高(一般用这个)
 * atomic:性能低(默认)

 
 4>setter和getter方法名称
 * setter :决定了set方法的名称,一定要有个冒号
 * getter :决定了get方法的名称(一般用在BOOL类型)

7.循环retain和@class

1>@class的作用:声明一个类:仅仅告诉编译器,某个名称是一个类
   @class Person;   //仅仅告诉编译器 Person是一个类

2>开发中引用一个类的规范
 * 在.h文件中用@class;来声明类 
------>为了提高编译效率(性能),只有父类一定要用import
 * 在.m文件中实现类

3> @class好处
 *能解决循环引用的问题
 *能提高性能

 面试问题:循环retain问题:比如A对象retainB对象,B对象retain了A对象这样会导致A对象和B对象永远无法释放
 两端循环引用解决方案
 *一端用 retain
 * 一端用 assign

8.autorelease

1>autorelease的基本用法
 * 会将对象放到一个自动释放池中
 * 当自动释放池被销毁时,会对池子里面的所有对象作一次release操作
 * 会返回对象本身
 * 调用完autorelease方法后,对象的计数器不变

 
2>autorelease的好处
 * 不用再关心对象释放的时间
 * 不用再关心什么时候调用release

 
3>autorelease的使用注意
 * 占用内存较大的对象不要随便使用autorelease
 * 占用内存较小的对象使用autorelease,没有太大影响

 
4>错误写法
* alloc之后调用了autorelease,又调用release野指针错误
 @autoreleasepool
 {
 Person *p =  [[[Person alloc] init] autorelease];

 
 [p release];
 }

* 连续调用多次autorelease野指针错误
 @autoreleasepool
 {
 Person *p = [[[[Person alloc] init] autorelease] autorelease];

 
 [p release];
 }
5> 自动释放池
 * 在ios程序运行过程中,会创建无数个池子,这些池子都是以栈结构存在(先进后出)
 * 当一个对象调用autorelease方法是,会将这个对象放到栈顶的释放池

 
6>自动释放池的创建方式
 * ios 5.0前
 //  xcode 5.0之前的autorelease
 //   NSAutoreleasePool *pool =  [[NSAutoreleasePool alloc] init];
 //
 //    Person *pp = [[[Person alloc] init] autorelease];

 
 //    [pool release]; [pool drain]

 
 * ios 5.0后
 @autoreleasepool
 {
 Person *p =  [[[Person alloc] init] autorelease];

 

 }

ARC编译特性&循环利用

1.ARC编译特性:

ARC的判断准则:只要没有强指针指向对象,就会释放对象

 
 1>.ARC特点
 *不允许调用release,retain,retainCount
 *允许重写dealloc,但是不允许调用[super dealloc]
 * @property参数
    * strong:成员变量是强指针(适用于OC对象类型)
    * weak:是成员变量的弱指针(适用于OC对象类型)
    * assign:适用于非OC对象类型
 *以前的retain改为strong其他一切不变

 
 2>指针分2种:
 *强指针:默认情况下,所有的指针都是强指针 __strong
 *弱指针: __weak

2.ARC循环利用

 当两端循环引用的时候,解决方案
 1> ARC
 1端用strong,另1端用weak

 
 2>非ARC
 1端用retain,另1端用assign
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: