一、管理对象:
在iOS的开发过程中,内存中的对象分为两类:基本数据类型、对象类型。
1.基本数据类型
比如int、float、double等基本数据类型的内存不需要我们来管理。这种类型在程序运行中会被放入栈中,它们依次紧密排列,在内存中占有一块连续的内存空间,遵循“先进后出”原则。
2.对象类型
继承于NSObject类的所有OC对象,都属于引用类型。这种类型在运行中被放入堆中,给对象分配内存空间时,会随机的从内存中开辟空间,对象与对象之间可能会留有不确定大小的空白空间,因此会产生很多内存的碎片,这种就需要我们开发者来管理。
总结:在性能上,栈内存要优于堆内存,这是因为栈遵循先进后出的原则,但是当数据量过大时,存入栈会明显的降低性能,这时我们会把大量的数据放入堆中,然后在栈中存放堆的地址。当需要调用数据时,就可以快速的通过栈内的地址找到堆中的数据。
二、管理方式
在iOS的开发过程中,每个OC对象内部都专门有四个字节来存储引用计数器,它是一个整数,表示对象被引用的次数,通过它可以判断对象是否被回收。Objective-C提供了两种内存管理机制:MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting)。
1.MRC(Mannul Reference Counting)手动管理内存
在iOS5.0以前,所有的对象都需要手动的添加retain、release来管理内存,遵循谁创建谁回收的原则,对引用计数器的操作全由程序员亲自完成。谁创建”alloc","new",谁"release";谁”retain",谁"release";retain的次数要和release次数相匹配。
retain:该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+ 1; release:该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount- 1; autorelease:该方法是将该对象内存的管理放到autoreleasepool中。
注意:永远不要手动调用对象的dealloc方法,而是让系统自动调用
2.ARC(Automatic Reference Counting)自动管理内存
ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。
该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。
ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中。默认所有实例变量和局部变量都是Strong指针;弱指针指向的对象被回收后,弱指针会自动变为nil指针,不会引发野指针错误。
注意:
(1)不能调用release、retain、autorelease、retainCount
(2)可以重写dealloc,但是不能调用[super dealloc]
(3)@property : 想长期拥有某个对象,应该用strong,其他对象用weak
(4)其他基本数据类型依然用assign
(5)两端互相引用时,一端用strong、一端用weak