Objective-CiOS Developer程序员

OC内存管理

2016-08-17  本文已影响161人  woooooo

内存管理的方式

为什么要管理内存



iOS应用程序出现Crash(闪退),90%的原因是因为内存问 题。  
在一个拥有数十个甚至是上百个类的的工程里 ,查找内存问题极其困难,      
学会内存管理,能帮我们减少出错的机率。 
iOS给每个应用程序分配了一定的内存,  
用于程序的运行。一旦超出内存上限,程序就会Crash。
对象的内存已经被系统回收,但是仍然使用指针操作这块内存。  
野指针异常是程序Crash的重要原因之一。  
代码量越大程序越容易出现野指针问题。

内存管理方式

引用计数

OC对象的操作 OC中对应的方法
生成对象 + alloc
持有对象 - retain
释放对象 -release/-autorelease
销毁对象 - dealloc

autoreleasepool的使用

NSAutoreleasePool


iOS5之前,使用NSAutoreleasePool自动释放池类创建对象。  

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // 动释放池创建
[pool release]; // 动释放池销毁

dealloc

- (void)dealloc {
    
    //这里面写一些本类使用的其他资源的销毁操作,并且需要在父类dealloc方法调用之前
    NSLog(@"调用了销毁");
    //MRC下重写dealloc方法需要调用父类的实现,ARC下重写dealloc方法不需要写[super dealloc],系统会自动调用
    [super dealloc];
}

    @autoreleasepool {
        for (NSInteger i = 0; i < 1000000000000; i++) {
            Person *p = [[Person alloc]init];
            [p autorelease];
        }
    }
//因为autorelease 出自动释放池才释放  所以造成内存增加

    
    @autoreleasepool {
        for (NSInteger i = 0; i < 1000000000000; i++) {
            @autoreleasepool {
                Person *p = [[Person alloc]init];
                [p autorelease];
            }
        }
    }

    //把一个对象添加到一个集合中会对该对象的引用计数加1,如果移除会将该对象的引用计数减1
    Person *p4 = [[Person alloc] init];
    NSMutableArray *arr = [NSMutableArray array];
    
    [arr addObject:p4];
    [p4 release];//release alloc的+1

内存管理原则

凡是使用了alloc,retain,copy让内存的引用计数 增加了,就需要使release或者autorele让内存的引 计数减少。在一段代码内,增加和减少的次数要相等。
   如果增加的次数多于减少的次数,会造成内存泄露。
   如果增加次数少于减少的次数,会造成过度释放。
   如果增加的次数等于减少的次数,还继续访问,造成野指针问题。
上一篇 下一篇

猜你喜欢

热点阅读