内存管理
分为两种
ARC
自动管理内存
MRC
手动管理内存
// 在ARC工程中需要手动管理内存时 首先需要把 gar 关掉
// 内存管理原则 : 谁创建 谁释放 谁保留 谁管理
//会使对象的引用计数增加的情况 :
1. 将视图控制器对象放在导航中
2.将对象放在数组中
3.xib 拖拽控件
4. 将视图控制器对象作为window 的rootViewController
5. 走set方法描述属性(retain)的时候 也会使引用计数增加
//系统方法是对象的引用计数增加的 我们不需要管理 系统将会自己处理 我们只需要 管理自己 alloc ,retain, new ,copy 出来的 必须要有 release / autorrelease 与其配对使用
//释放原则 :
1. 局部变量 : 用完之后直接release
2. 全局变量 : 在dealloc方法中释放 写在 [super dealloc]的上边
3. 方法内创建的对象需要在方法外使用 采用 autorelease 延迟释放
4. 系统的 “ + “ 号方法创建的对象采用的就是 autorelease;
//特别注意 : 通过系统的 + 号方法 创建的对象 什么时候会被释放(eg: button 数组 字典 等)
内存管理会出现的问题 :
1 .内存泄露 : 对象的引用计数 始终不为0 永远留在内存中
2. 过渡释放 : 对象在使用的时候 发现对象已经被销毁 过渡释放的时候 程序会出问题 : //EXC_BAD_ACCESS 意思是: 执行坏的访问 内存错误 输出台没有崩溃原因
详解 :
1. retainCount 查看对象引用计数时调的后缀 eg:
Dag * dag1 = [[ Dag alloc ] init ];
//retainCount 查看引用计数
NSLog ( @"=====%d" ,dag1. retainCount );
2. 添加控件时( addSubview ) 系统为了保留使用对象的所有权 也会使引用计数加 1 会自行销毁
3.注意数组:
//通过加号方法 内部实现的时候 其实是alloc + autorrelease
_arr2 = [ NSArray arrayWithObjects : @"1" , @"22" , nil ];
//系统方法子啊创建_arr2 的时候 autorrelease 延迟释放(在viewDidLoad 方法中先走完 系统alloc的那一次就会被释放掉)为了不让对象销毁 我们使用该对象的时候 也retain一个 保留该对象的所有权
//如果想在别的方法中使用的时候 我们也需要 return 自己保留对象的所有权
[ _arr2 retain ];( 记得在dealloc中释放 )
- ( void )dealloc {
[ _arr2 release ];
_arr2 = nil ;//可以立即将release对象指为空 这样更保险
[ super dealloc ];
//为什么需要将释放写在此代码的上边?
: 对象释放的时候 先进行本类对象的释放 然后将从父类继承过来的对象释放掉
// 在ARC工程中需要手动管理内存时 首先需要把 gar 关掉
// 内存管理原则 : 谁创建 谁释放 谁保留 谁管理
//会使对象的引用计数增加的情况 :
1. 将视图控制器对象放在导航中
2.将对象放在数组中
3.xib 拖拽控件
4. 将视图控制器对象作为window 的rootViewController
5. 走set方法描述属性(retain)的时候 也会使引用计数增加
//系统方法是对象的引用计数增加的 我们不需要管理 系统将会自己处理 我们只需要 管理自己 alloc ,retain, new ,copy 出来的 必须要有 release / autorrelease 与其配对使用
//释放原则 :
1. 局部变量 : 用完之后直接release
2. 全局变量 : 在dealloc方法中释放 写在 [super dealloc]的上边
3. 方法内创建的对象需要在方法外使用 采用 autorelease 延迟释放
4. 系统的 “ + “ 号方法创建的对象采用的就是 autorelease;
//特别注意 : 通过系统的 + 号方法 创建的对象 什么时候会被释放(eg: button 数组 字典 等)
内存管理会出现的问题 :
1 .内存泄露 : 对象的引用计数 始终不为0 永远留在内存中
2. 过渡释放 : 对象在使用的时候 发现对象已经被销毁 过渡释放的时候 程序会出问题 : //EXC_BAD_ACCESS 意思是: 执行坏的访问 内存错误 输出台没有崩溃原因
详解 :
1. retainCount 查看对象引用计数时调的后缀 eg:
Dag * dag1 = [[ Dag alloc ] init ];
//retainCount 查看引用计数
NSLog ( @"=====%d" ,dag1. retainCount );
2. 添加控件时( addSubview ) 系统为了保留使用对象的所有权 也会使引用计数加 1 会自行销毁
3.注意数组:
//通过加号方法 内部实现的时候 其实是alloc + autorrelease
_arr2 = [ NSArray arrayWithObjects : @"1" , @"22" , nil ];
//系统方法子啊创建_arr2 的时候 autorrelease 延迟释放(在viewDidLoad 方法中先走完 系统alloc的那一次就会被释放掉)为了不让对象销毁 我们使用该对象的时候 也retain一个 保留该对象的所有权
//如果想在别的方法中使用的时候 我们也需要 return 自己保留对象的所有权
[ _arr2 retain ];( 记得在dealloc中释放 )
- ( void )dealloc {
[ _arr2 release ];
_arr2 = nil ;//可以立即将release对象指为空 这样更保险
[ super dealloc ];
//为什么需要将释放写在此代码的上边?
: 对象释放的时候 先进行本类对象的释放 然后将从父类继承过来的对象释放掉
}