iOS5之后苹果公司引入了ARC机制,大大方便了ios开发者对内存的管理机制。在iphone 4出世的时候为什么ios在512M的内存中可以运行很大的游戏,保持畅快流畅的状态。得益于ios非常好的内存处理机制。
在我们现在创建项目的时候,默认会直接引入ARC机制,我们可以关闭ARC机制:在输入框中输入long点击搜索按钮,如图:
接下来即可进行老版本的内存操作了。
在老版本中,内存操作采用了引用计数(retainCount)alloc retain(+1)release(-1)
内存管理原则(配对原则):只要出现了new,alloc,retain,就一定配对出现一个release,autorelease
使引入数+1,必须对应的-1,务必成对存在
ClassA *obj1 = [[ClassA alloc] init]; //retaincount = 1
ClassA *obj2 = obj1; //retaincount = 1
[obj2 retain]; //retaincount = 2
当引入计数变为0的时候,会自动调用系统的dealloc系统函数
-(void)dealloc
{
[super dealloc];//注意一定要调用父类函数
NSLog(@"对象被删除");
}
野指针:在开发中经常会遇到野指针,系统一般会提示为Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误。因为你访问了一块已经不属于你的内存。
但我们在开发中可能会发现系统并不会时时检测野指针,主要是为了提高编译效率,默认关闭了野指针检测机制,打开方法:
在Enable Zombie Objects上点击对号,关闭即可。
注意:一般我们最好不要打开该机制,这样编译时的效率将大大降低。
内存泄露:
只要对象的retainCount !=0就会一直存在在内存中,不再被使用的对象,一直在内存中没有被销毁,则会造成内存泄露。
@property 参数
1.与set方法内存管理相关参数
retain:要生成符合内存管理原则的set方法(应用与对象类型)
assign:直接赋值(对象类型,基本数据类型)
capy
2多线程相关
nonatomic:不生成多线程代码。(一般都用这个,效率高)
atomic:生成多线程管理代码
3.是否要生成set跟get方法
readwrite:可读可写属性,同时生成set跟get方法
readonly:只读属性,只生成get方法
4.set与get方法名称相关的参数
setter:设置生成set方法的名称
getter:设置生成的get方法名称
实例:
@property(nonatomic,retain)Class *class;
@property(nonatomic,retain)NSString *name;
@property(nonatomic,assign)int age;
@property(nonatomic,assign,readonly)int age;@property(nonatomic,assign,setter=abc:)int age;//注意有冒号