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方法会返回对象本身
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];
}
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类型)
1>@class的作用:声明一个类:仅仅告诉编译器,某个名称是一个类
@class Person; //仅仅告诉编译器 Person是一个类
2>开发中引用一个类的规范
* 在.h文件中用@class;来声明类 ------>为了提高编译效率(性能),只有父类一定要用import
* 在.m文件中实现类
3> @class好处
*能解决循环引用的问题
*能提高性能
面试问题:循环retain问题:比如A对象retainB对象,B对象retain了A对象这样会导致A对象和B对象永远无法释放
两端循环引用解决方案
*一端用 retain
* 一端用 assign
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];
}
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