首页 > 代码库 > 关于内存管理

关于内存管理

最近都是ARC写代码,弄了一下午整理了一下MRC的使用,原创哦!~!~~

1 任何继承NSObject的对象,都需要管理内存
2 基本数据类型放到栈中,对象放到堆空间中
3 oc对象 nil指针 release 不报错
4 僵尸对象检测 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾选Enable zomble objects

---------单个对象的内存管理---------

每个对象给引用计数器分配四个字节的存储空间,当对象的引用计数器为零时,系统自动回收对象
对象 retain 计数器加1


对象 alloc retain copy 引用计数器加1

 

dealloc 对象被销毁,系统会自动给对象发送一条dealloc方法
dealloc里面写东西一定最后调用[super dealloc];

ios的main函数是个死循环

 

---------多个对象之间的内存管理---------

 

oc对象管理内存

 

内存管理

1 任何继承NSObject的对象,都需要管理内存
2 基本数据类型放到栈中,对象放到堆空间中
3 oc对象 nil指针 release 不报错
4 僵尸对象检测 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾选Enable zomble objects

---------单个对象的内存管理---------

每个对象给引用计数器分配四个字节的存储空间,当对象的引用计数器为零时,系统自动回收对象
对象 retain 计数器加1


对象 alloc retain copy 引用计数器加1

 

dealloc 对象被销毁,系统会自动给对象发送一条dealloc方法
dealloc里面写东西一定最后调用[super dealloc];

ios的main函数是个死循环

 

---------多个对象之间的内存管理---------

 

oc对象管理内存


1 Set方法:将传进来的对象,给类的_成员变量,赋值。
2 Get方法:返回_成员变量.

3 关于set方法的内存管理流程(以人书为例):
set方法,将传进来的book给_book赋值,先要对book 做一次retain计数器加一
_book=[book retain];

person类被销毁时,会调用dealloc方法,所有在这里要对_book最一次release,

4 set方法的标准写法(非常重要)

- (void)setCar:(Car *)car

{

if (car!=_car) { // 1
[_car release];// 2
_car=[car retain]; // 3

}
}
注释:set方法,提供方法以便修改一个类下划线成员变量的值,
1 正常情况下,只修改一次成员变量的值,只写3即可(将传入的对象retain下在赋值),
2 如果再次修改成员变量值,则需要对之前传入的对象做一次release,即当前对象_car。
3 为了严谨,需加判断,现在传入的对象非当前对象。

5 - (Car *)car

{

return car;

}

 

6 - (void)dealloc
{

// 1:对当前所拥有的所有对象做一次relase方法

[_car release];

[super dealloc];
}

在MRC中 4,5,6是setter getter的标准写法
// 2:最后调用


//property


//property只影响Getter/Setter方法,dealloc还需自己手动释放
@property Book *book;


//property 变量 意味着:生成带下划线的成员变量,自动生成setter/getter方法.

//Setter方法是直接赋值(无release旧值 retain新值操作)
//getter方法是返回


//如果两个方法你都手动实现,意味着覆盖原来生成的get/set方法


//如果只实现get/set其中的一个方法,还是会生成带下划线的成员变量,原方法不会被覆盖.

 


//@property(retain) Book *book;

参数retain:意味着 release旧值 retain新值
被retain的对象,一定要在dealloc中release下

 

//@property(assign) int age;
参数assign:意味着 直接赋值(默认就是直接赋值)

 

//@property(copy) Book *book;
参数copy:意味着 release旧值 retain新值


//@property(readonly/readwrite)
只生成get方法/set方法

PS:所以MRC中,property需要配合dealloc使用

 

//循环引用
@class:仅仅告诉编译器这是一个类.就可以引用一个类
一方包含头文件 把两边头文件中的#import换成@class即可
实现文件中#import.

 

//解决循环引用问题:
两端 一边用@property(retain) dealloc继续release
一边用@property(assign) dealloc无需release


//autorelease
//@autoreleasepool

当对象 调用autorelease方法时,系统会将对象放到释放池中,对对象的计数器无任何影响

 

//@autoreleasepool PS:ios5.0之后的

//在ios5.0之前 需要创建一个自动释放池对象,在销毁!~
@autoreleasepool
{//开启释放池

}
//结束释放池(池中所有对象做一次release操作)

自动释放池是存在系统的栈中的(这和局部变量的栈不是一个),栈的特点是先进后出

 

 

自动释放池是存在系统的栈中的(这和局部变量的栈不是一个),栈的特点是先进后出