黑马程序员技术交流社区
标题:
内存管理中的@property @class @autoreleasepool
[打印本页]
作者:
liminghui
时间:
2015-9-17 18:54
标题:
内存管理中的@property @class @autoreleasepool
@property参数:
书写规范: @property (参数1,参数2) 数据类型 变量名
内存管理中@property的相关参数:
C:\Users\Administrator\Desktop
@property.png
(196.73 KB, 下载次数: 7)
下载附件
2015-9-17 18:53 上传
set方法处理中:
retain : 对对象release旧值,再retain新值(使用于OC对象类型)
assign : 直接赋值 (默认 使用于非OC对象类型)
copy : release旧值 ,copy新值
什么时候使用retain :
形式: @property (nonatomic,retain)Car * car;
在一个类中有关联其他对象的时候。
什么时候使用assign :
形式: @property (nonatomic,assign)int age;
实例变量是基本数据类型的时候。
@class 的使用:
书写规范: @class 类名; 例: @class person;
含义: 告诉编译器,person 是一个类,至于类中有哪些属性和方法,此处不去检测,只是做一个声明。
好处: 如果person文件内容发生了改变,而包含@class person的头文件的文件则不会重新编译。
@class 可以解决循环引入的问题 (a里有b,b里有a);
个人理解:
假如有文件 a,b,c,d类,a,b,c,d中都可以引用x类中的属性和方法,以前我们会在a,b,c,d的.h文件中标注“ import ''x.h'' ”头文件,但是如果x文件中的内容改变了,那么a,b,c,d中引用x的内容也会随之改变,不管你是否真的去引用,这样程序工作很不效率,所以我们只要在a,b,c,d的.h文件中把“ import ''x.h'' ”换成@class x;并且谁要调用x文件中的东西 就在谁的.m文件中写上 #import即可,这样效率大大的提高。
.h : @class x
.m : #import ''x.m''
自动释放池 autorelease:
autorelease 是栈结构,特点:先进后出
autorelease的好处:
1 不需要再关心对象释放的时间
2 不需要再关心什么时候调用 release
autorelease的特点:
1 对象可以加入自动释放池中
2 自动释放池结束时,会给池中的对象发送一条release消息
autorelease的使用:
1 创建自动释放池:
@autoreleasepool {
}
2 加入自动释放池中:
[对象 autorelease];
autorelease的使用注意:
1 并不是所有放到自动释放池中的代码产生的对象就会自动释放,如需要释放,必须加入到自动释放池中。 [对象 autorelease];
2 如果对象调用了autorelease,但是没有在任意一个自动释放池中,该对象也不会被加入到自动释放池。
3 另一种形式:
Person *p = [Person new];
@autoreleasepool {
[P autorelease];
}
4 自动释放池的镶嵌:
1 @autoreleasepool {
2 @autoreleasepool {
3 @autoreleasepool {
}
}
}
先释放 3 @autoreleasepool然后是2 @autoreleasepool最后是1 @autoreleasepool
这就是先进后出。
5 自动释放池中不宜放占用内存较大的对象, 不要把大量循环操作放到同一个@autorelease中
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2