手动内存管理
什么是内存管理
.进程空间
-代码区:只读
-堆:自己创建、自己回收释放,对象是保存在堆区的。
-全局区:进程启动时候分配,进行结束时释放。
-栈:局部变量,自动创建,自动释放空间
.什么是内存管理
-只要对堆内进行管理,所谓的管理是值内存的分配(创建)和释放(回收).
引用计算器为1(alloc,copy,new)
.引用计算器为1(alloc,copy,new)
-每个对象都有自己的引用计数器,引用计算器是用来计算对象被引用的次数
-发送消息时(alloc,copy,new),将引用计数器置1。
assign关键字
-retain如果属性是对象,就会使用此关键字,解决内存问题
-asssign如果属性是基本数据类型,默认’就是assign,不会解决内存问题。
-copy一些特殊对象类型,如果不希望和比人共享一个对象用copy会自动创建一个新的对象。
-readonly 只读,去掉setter,只保留getter
-weak,用于一些基本控件
引用计数器加1(retain)
.引用计数器加1(retain)
当你需要使用一个别人创建好的对象时,为了防止在使用此对象期间别人释放了这个对象,我们要将此对象的引用计算器加1(程序员通知引用计数器),只要给对象发送retain消息,引用计数器就会加1.
引用计数器减1(release)
引用计数器减1(release)
-当你使用的对象不在使用的时候,就发送release消息
-release消息将对象的引用计数器减1
-如果引用计数器为0,则释放对象所占的存储空间
dealloc与对象销毁
.dealloc与对象销毁
-当对象的引用计数器为0时,说明已经没有任何引用指向对象,对象就会被系统自动销毁
-系统销毁对象之前,会自动向对象发送一条消息“dealloc”消息,对象所占的空间就会被释放,千万不要自己去调用dealloc消息
.可以使用“retainCount消息“,查看当前引用计数器的值。
.野指针与空指针
.野指针与空指针
-当你指向的对象,不在使用时,如果忘了发送release消息,内存泄露(资源浪费)
-当引用指向的对象已经不存在了,继续向对象发送消息,会发生问题,如异常,crash
-没有相应内存空间的指针,野指针
-会使用空指针,解决指针问题,而在oc中,向空指针发送消息,是不会报错的stu = nil;
声明式属性与内存管理
.声明式属性与内存管理
-注意:声明属性默认情况下,并没有解决内存问题
-当使用@property(retain)引用数据类型,帮我们解决了setter使用中内存问题,但dealloc中的release操作,还是需要我们自己来做的。
atomic与nonatomic
.atomic与nonatomic
-nonatomic非原子性操作,安全性低,效率高。
-atomic 原子性操作,在多线程使用的时候,一般是用来防止写未完成的时候,被另一个线程读取,造成数据安全性问题,这种操作消耗资源的。
自动释放池
什么是自动释放池
通过释放池来管理对象,只需要一个自动释放池,可以管理很多对象,但自动释放池结束的时候,会自动向池中的每个对象发送release消息