标签:内存管理 class property autorelease
1.通常引用一个类有两种方法:
1,通过#import 方法引入
2.通过@class 引入
#import 和@class 的区别:
#import "B.h" @interface A:NSObject { B *b; } @end
1.#import 方式会包含被引用类的所有信息,包括被引用类的变量和方法。@class 方式只是告诉编译器在a.h文件中B *b只是类的声明,具体这个类里有什么信息,这是不需要知道,等实现文件中真正用到的是否,才会去查看B类中信息。
2.使用@class方式由于只需要知道被引用类(B类)的名称就可以了,而在现实类由于要用到被引用类中的实现变量和方法,所以在.m文件中需要使用#import来包含被引用类的头文件。
3.如果有些文件一次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要从新编译一遍,这样的效率也是可想而知的。而相对来讲,使用@class凡是就不会出现这种问题。
4.内存管理_property 参数:
(当一个类中的成员变量中有很多的OC对象的是否,这时候对于对象之间的管理内存问题会很麻烦,特别是在setter方法里面,这时候,编译器就引入了property的retain参数,来进行管理内存。
1.retain:如果property里面有retain参数,那么编译器在setter方法里面,编译器会自动加上,先release旧值,然后再retain新的值。 所以,如果你在一个类中定义的是基本数据类型如:@property int age 。这时候不需要任何操作,其中已经包含assign操作(直接赋值),但是如果类中定义的是一个OC 对象,那么你需要用retain如:@property (retain ) Student *stu;
Assign :默认类型,setter方法直接赋值,不进行retain操作。
Readonly :只生成getter的方法
Readwirte :setter 和getter的方法都生成
copy:setter 方法release 旧值,再copy新值。
atomic:默认属性:提供多线程安全。,代表给方法加锁,保证线程安全(耗性能)
nonatomic,代表方法不需要考虑线程安全问题。
注意:基本上所有的属性都是nonatomic类型,不需要考虑atomic,因为性能问题。
property里面还可以指定setter 和getter方法的名字,例如:@property (setter = setAge,getter = getAge) int age; 这样就指定了setter和getter 方法:
5.自动释放池:
是OC里面的一种内存自动回收机制,一般可以将一些临时变量放到自动释放池里面去,统一回收释放
当自动释放池销毁的时候,池里面的所有对象都会调用一次release方法:
OC对象只需要发送一条autorelease 消息,就会把这个对象添加到最近的自动释放池中,(栈顶的释放池)
Autorelease 实际上只是把对release的调用延迟了,对于每一次autorelease ,系统只是把该对象放入了当前autorelease pool 中,当该pool被释放时,该pool中的所有对象会被调用release。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:内存管理 class property autorelease
原文地址:http://blog.csdn.net/u012989536/article/details/47668065