/* 内存管理:
1.管理内存的原因: 移动设备内存有限,App占用的内存也有限,我们在内存使用过程中需要回收一些不再使用的内存;
2.内存管理的范围: 任何继承NSObject的对象,对其他基本数据类型无效 ; ->
<span style="font-size:24px;">people *p = [People alloc]init];</span>
1)局部变量存储 在栈中, 对象存储在 堆 中
局部变量:只是在方法内部定义的变量叫作局部变量(变量名的生命周期)
2)栈区的内存由系统进行管理和释放,我们只需要管理堆区的内存就可以
3) 栈释放,堆未释放->内存泄露
栈存在,堆释放->野指针
3. 管理机制:引用计数
4. 内存管理的原则:
1) 保证在使用的时候安全,保证在不使用的时候消失
2)谁负责引用计数+1,谁就要负责引用计数-1
3) 通过类方法创建的对象,是自动释放的,它已经添加到了自动释放池
5.关于 retain, alloc, autorelease copy;
1).alloc 代表创建一个引用计数为1的对象
2).retain 使得引用计数加1
注:引用计数的打印
NSArray *arr = [NSArray array];
NSLog(@"%d",arr.retainCount);
3). 自动释放池: 内存延迟释放
dkop创建一个自动释放池(老写法)
<span style="font-size:24px;">NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
Car *c = [[Car alloc]init];
[c autorelease]; // 修饰的这句话判断距离(创建池到修饰的距离->由上到下)
// 只有autorelease修饰的对象会添加到自动释放池;
[pool release];</span>
6. 关于重写set,get 方法
注:只要调用了alloc,就必须有release(autorelease)
1)set方法
1. 基本数据类型,直接复制
-(void)setAge:(int)age
{
_age = age;
}
2. OC对象类型
-(void)setCar:(Car *)car
{
(1) 先判断是不是原先传进来的对象
if(_array == array)
{
(2) 对旧对象进行一次release
[_array release];
(3) 对新对象进行一次retain
_array = [array retain];
}
}
2)get方法
-(NSArray *)getCAr:(Car *)car
{
[_array retain];
return [ array autorelease];
}
3.属性 @property的参数
(1)内存管理相关参数
Retain:对对象release旧值,retain新值(适用于OC对象类型)
Assign:直接赋值(默认,适用于非oc对象类型)
Copy:release旧值,copy新值
(2)是否要生成set方法(若为只读属性,则不生成)
Readonly:只读,只会生成getter的声明和实现
Readwrite:默认的,同时生成setter和getter的声明和实现
(3)多线程管理(苹果在一定程度上屏蔽了多线程操作)
Nonatomic:高性能,一般使用这个
Atomic:低性能
7. 关于内存管理中的循环引用问题
@class 类名;——解决循环引用问题,提高性能
@class Student;
注:
声明可能有这么一个类,但不知道这个类是否存在
以后在.h 里引用必须使用@class; .m文件里直接使用 #import 引用
(1)@class的作用:声明一个类,告诉编译器某个名称是一个类
(2)开发中引用一个类的规范
1)在.h文件中使用@class来声明类
2)在.m文件中真正要使用到的时候,使用#import来包含类中的所有东西
(3)两端循环引用的解决方法
一端使用retain,一端使用assign(使用assign的在dealloc中也不用再release)