开发三年之余,感觉对ios的内存理解一直不是很透彻,打算这两天好好补补这方面的知识,要是有理解不对的地方大家多多包涵.欢迎来喷.
说到内存管理印象最深刻就是"黄金法则 - 如果一个对象使用了alloc,[mutable] copy,retain,那么你必须使用相应的release或autonrelease".
总的来说就是当你使用 alloc, retain ,new ,copy的时候引用计数器加1,使用release的时候引用计数器减1,当引用计数器为0 的时候释放内存调用dealloc方法,改对象就不能使用了.
规则:
1 . 在OC的类中使用了"引用计数器"(对象当前被引用的次数,也可以理解成指向内存区域的指针数)
2 . 最初对象的"引用计数" = 1 ([nsobject retainCount] = 1 Autorelease pool的存在,对于内存的管理会相当复杂,retainCount就不能用作调试内存时的依据了)在ARC开启的时候获取retainCount就得用一下的方法
CFGetRetainCount((__bridge CFTypeRef)myObject)
3 . alloc , copy , retain 一个对象的时候,改对象的引用计数加 1
4 . 当不需要对象的时候就给对象发送release 的消息,引用计数就自动减1
5 . 当引用计数等于0 的时候,自动调用dealloc 函数,对象就会释放内存
6 . 当对象引用计数 的时候再调用该对象,程序就会crash
内存管理可以分成"堆"和"栈"
在"堆"中内存管理都是用"引用计数"模式 ,而"栈"中不是
1. NSSTring 定义的对象是保持栈中所有没有引用计数,对他进行return操作是不会改变retainCount的(补充一下stack 是后进先出-LIFO 结构)
2.NSMutableSTring 定义的对象是保持堆中所有没有引用计数,对他进行return操作retainCount加1