当你的程序结束的时候,你要知道如何去管理应用程序的内存,不需要的对象要释放掉。
内存管理的示例图如下:
从图中可以看出,当没有指针指向某个对象的时候,这个对象将会被摧毁。
Objective-c提供了两种内存管理的方式:
1、MRC(manual retain-release):手动的内存管理,从英文也可以看出有retain和release来管理内存;
2、ARC(Automatic Reference Counting):自动内存管理,编译器在编译的时候,编译器会在适当的地方插入相应的内存管理的代码。
防止内存相关的问题的好方法:
两种方法导致不正确的内存管理:
①释放或重写正在使用的数据会导致内存错误,主要引起程序崩溃,错误或者用户数据错误;
②没有释放不在使用的数据导致内存泄漏内存泄漏就是分配好的内存空间没有释放或者不在使用,泄漏导致你的应用程序在使用不断增加的内存,会导致很差的系统表现,或者你的应用程序被终结。
内存管理政策
基于内存管理的规则
内存管理模式基于对象的拥有权,任何对象都拥有一个或多个所有者,只要一个对象还有一个或多个所有者,对象将继续存在,如何对象没有所有者,那么运行期间系统将会自动destroy他。
-你对你创建的对象拥有所有权;
-你可以通过retain来获得一个对象的拥有权;
-如果你不需要某个对象,你必须放弃对这个对象的拥有权;
-你不能释放你不是拥有者的对象。
自动释放池
-自动释放池通过@autoreleasepool标记
- @autoreleasepool {
- // Code that creates autoreleased objects.
- }
@autoreleasepool {
// Code that creates autoreleased objects.
}
在自动释放池结束的时候,在块里面的对象会接收到
autorelease
信息,系统会在适当的时候释放这个对象。
-跟其他代码块一样,自动释放池是可以重叠的
- @autoreleasepool {
- // . . .
- @autoreleasepool {
- // . . .
- }
- . . .
- }
@autoreleasepool {
// . . .
@autoreleasepool {
// . . .
}
. . .
}
如果你在自动释放池外面发送一个autorelease信息,Cocoa会记录一个合适的错误信息。
-可以自己创建一个自动释放池,以下三种情况:
-如果你的程序不是基于UI框架的;
-如果你写了一个循环,里面产生了大量的临时变量对象;
-如果你创建第二线程(你必须创建自己的自动释放池一旦你的线程开始执行,否则你的程序将会泄露对象)。
ARC的新规则①你不能很明确的应用dealloc,或者继承或引用retain, release,retainCount, or autorelease;
-使用@selector(retain), @selector(release), 等等也是禁止的;
-在ARC中使用自定义的dealloc方法不需要调用 [super dealloc];
-你仍然可以使用CFRetain, CFRelease, 和Core Foundation-style相关的其他功能;
②你不能使用NSAllocateObject orNSDeallocateObject;
③在C结构体中不能使用对象指针;
④id和*没有实质性区别;
⑤你不能使用NSAutoreleasePool对象:
-ARC允许@autoreleasepool blocks代替,这比NSAutoreleasePool更有优势;
⑥你不能使用内存区域;
⑦你不能以new开头来命名一个存取器。
Weak引用
Weak引用并不延长他指向的对象的生命时间,当没有strong指向这个对象的时候会自动的变为nil。
你应当充分利用这些特性来管理你程序中的对象图,特别是ARC并不反对strong引用,利用weak来保证你不创建一个环。
在ARC中,strong是对象类型默认的。
更多的内存管理知识,请大家参照苹果开发者文档。