OC_内存管理笔记


1.方法的基本使用

 1> retain计数器+1会返回对象本身

 2> release计数器-1没有返回值

 3> retainCount获取当前计数器

 4> dealloc

    *当一个对象要被回收的时候,就会调用

    *一定要调用[super dealloc]这句调用要放在最后面

 

2.基本概念

 1>僵尸对象所占用内存已经被回收的对象,僵尸对象不能再使用

 2>野指针指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS

 3>空指针没有指向任何东西的指针(存储的东西是nilNULL0),给空指针发送消息不报错

 

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

 

4.多对象内存管理

 1> 你想使用(占用)某个对象,就应该让对象的计数器 +1(让对象做一次retain造作)

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

 3> retainrelease

 4> allocrelease


5.set方法内存管理

基本数据类型不需要内存管理

1>内存管理代码规范:

 *只要调用了alloc,必须有releaseautorelease

 *基本数据类型不是通过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方法内存管理相关的参数

 * retainrelease旧值,retain新值(适用于OC对象类型)

 * assign:直接赋值(默认,适用于非对象类型)

 * copy release旧值,copy新值

 

 2>是否生成set方法

 * readwwrite同时生成settergetter的声明,实现(默认)

 * readonly只会生成getter的声明,实现

 

 3>多线程管理

 * nonatomic性能高(一般用这个)

 * atomic:性能低(默认)

 

 4>settergetter方法名称

 * setter :决定了set方法的名称,一定要有个冒号

 * getter :决定了get方法的名称(一般用在BOOL类型)


7.循环retain和@class

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

   @class Person   //仅仅告诉编译器 Person是一个类

2>开发中引用一个类的规范

 * .h文件中用@class;来声明类  ------>为了提高编译效率(性能),只有父类一定要用import

 * .m文件中实现类

3> @class好处

 *能解决循环引用的问题

 *能提高性能


 面试问题:循环retain问题:比如A对象retainB对象,B对象retainA对象这样会导致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特点

 *不允许调用releaseretainretainCount

 *允许重写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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值