标签:
开启僵尸监听
retain 不仅仅会对计数器 + 1,而且还会返回当前对象
标号 | 标题 | 内容 |
---|---|---|
一 | 内容管理 | 内存管理的重要性/内存管理概念/堆和栈/内存管理原则/多对象内存管理/set方法内存管理/dealloc方法的内存管理 |
二 | 引用计数器 | 引用计数概念器/作用/操作 |
三 | dealloc | dealloc方法基本概念 |
四 | 野指针/空指针 | 僵尸对象概念/野指针概念/空指针概念 |
五 | Xcode设置 | 如何关闭ARC功能/如何开启僵尸对象监控 |
六 | Property修饰符 | 控制set方法的内存管理/控制需不需要生成set方法/多线程管理/控制set方法和get方法的名称 |
七 | @class | @class基本概念/应用场景/@class和#import区别 |
八 | 循环retain | 循环retian基本概念 |
ARC: Automatic Reference Counting
什么是自动引用计数
移动设备的内存极其有限,每个app所能占用的内存是有限制的
下列行为都会增加一个app的内存占用
如果app占用内存过大, 系统可能会强制关闭app, 造成闪退现象, 影响用户体验
如何回收那些不需要再使用的对象?
所谓内存管理, 就是对内存进行管理, 涉及的操作有:
内存管理的管理范围
只有OC对象才需要进行内存管理的本质原因
栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(先进后出);
堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS(Operating System 操作系统)回收,分配方式类似于链表。
示例:
int main(int argc, const char * argv[])
{
@autoreleasepool {
int a = 10; // 栈
int b = 20; // 栈
// p : 栈
// Person对象(计数器==1) : 堆
Person *p = [[Person alloc] init];
}
// 经过上一行代码后, 栈里面的变量a\b\p都会被回收
// 但是堆里面的Person对象还会留在内存中,因为它是计数器依然是1
return 0;
}
苹果官方规定的内存管理原则
谁创建谁release :
谁retain谁release:
总结一下就是
- (void)setRoom:(Room *)room
{
// 避免过度释放
if (room != _room)
{
// 对当前正在使用的车(旧车)做一次release
[_room release];
// 对新车做一次retain操作
_room = [room retain];
}
}
- (void)dealloc
{
// 当人不在了,代表不用房间了
// 对房间做一次release操作
[_room release];
[super dealloc];
}
系统是如何判断什么时候需要回收一个对象所占用的内存?
什么是引用计数器
简单来说, 可以理解为:
当没有任何人使用这个对象时,系统才会回收这个对象,也就是说
任何一个刚创建的对象, 引用计数器都为1
引用计数器的常见操作
需要注意的是:release并不代表销毁\回收对象,仅仅是计数器-1
对象即将被销毁时系统会自动给对象发送一条dealloc消息 (因此, 从dealloc方法有没有被调用,就可以判断出对象是否被销毁)
作用
规律
dealloc方法的重写
一旦重写了dealloc方法, 就必须调用[super dealloc](在MRC环境下),并且放在最后面调用
使用注意
给空指针发消息是没有任何反应的
为了避免野指针错误的常见办法
- 项目--> Bulid Setting / All --> 搜automatic-->将Objective-C Automatic Reference Counting 改成 No
默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错。为了方便调试,应该开启僵尸对象监控
- Edit Scheme-->Diagnostics-->Objective-C后的Enable Zombile Objects 打√号
作用
简单使用
具体使用
#import "B.h"
@interface A : NSObject
{
B *_b;
}
@end
#import “A.h"
@interface B : NSObject
{
A *_a;
}
@end
@class B;
@interface A : NSObject
{
B *_b;
}
@end
@class A;
@interface B : NSObject
{
A *_a;
}
@end
作用上的区别
效率上的区别
循环retain的场景
循环retain的弊端
循环retain的解决方案
标签:
原文地址:http://www.cnblogs.com/HMJ-29/p/4700222.html