从刚开始,就一直听到学长,还有一些学的比我快的同学再说内存管理这个问题,但是听他们讲并不能让我完全理解这个问题,所以我决定要好好学习一下内存管理
在写OC程序时会创建大量的对象,有些系统会自动释放,但当我们把它存储在堆中时,它就不能自动释放,如果不能及时释放,就会一直在那里占着我们的内存,我们就需要手动释放它们
我们正在使用的X-code中引入了ARC机制,会自动给我们的程序添加释放内存的代码,但有时候他并不能完美的解决你的问题,所以我们要学会自己手动释放内存。因为在OC中没有垃圾回收机制,所以我们必须要用到一个东西,他叫计数器。在OC中,每个对象内部都有一个与之对应的整数,叫做“引用计数器”,这个对象创建后,它的引用计数器为1,当调用了对象的alloc、return、new、copy方法后引用计数器会+1,当release后-1,当引用计数为0,那么系统会销毁这个对象。
当一个对象被回收后,我们可以用dealloc来确定他是否被回收,当他被释放后,我们必须把最后引用他的变量手动设置成nil,不然会出现指针指向一个已经被释放掉的内存的错误。
我们在释放内存时,必须遵守一个规则,那就是**谁创建,谁释放**
当一个对象被创建,被其他方法调用后需要释放的,在该方法内释放后必须重新赋值,并且retain,否则会发生你在需要调用它时会发生错误。在给一个对象赋新的值的时候,也必须先对原有的值进行release操作。
还可以用@property惊醒自动实现。
(https://img-blog.youkuaiyun.com/20151115204530406)
@property可以添加三个参数,如果我们不手动设置,则系统会选择默认值(atomic,readwrite,assign)
在OC中也存在一个自动释放内存的机制,叫做“自动释放池”,这是一个半自动的释放机制,自动释放池就是我们新创建的一个OC程序时自动出现的@autoreleasepool{},在对象初始化时如果点用了@autoreleasepool,那么这个对象会自动调用一次release方法,这样就起到了自动释放的作用。**自动释放池实质是当自动释放池销毁后调用对象的release方法,不一定就能销毁对象**
ObjC中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法。
唐隽
内存管理
最新推荐文章于 2025-01-23 15:08:21 发布