内存管理分为两种 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];
//为什么需要将释放写在此代码的上边?
: 对象释放的时候 先进行本类对象的释放 然后将从父类继承过来的对象释放掉
}