Objective-c内存管理总结

来源:互联网 发布:qt5 linux windows 编辑:程序博客网 时间:2024/05/21 19:43
1. 一般情况下,对于类型是对象的成员变量,如果设置了对应的@property,就用以下这种格式释放:
    1.    self.xxx = nil;
复制代码
只要setter方法正确,这段代码自然能release对象,顺便还能赋nil;

2. 如果没有设置@property,就是直白的方法
    1.    [xxx release];
    2.    xxx = nil;

1、通过分配或复制创建的对象保持计数为 1;
2、假设任何别的方法获取的对象保持计数为1, 而且在自动释放池中,要想在当前执行范围外使用该对象,就必须保持它;
3、向集合添加对象时它就被保持,从集合移走对象时就被释放。释放集合对象(如 NSArray )会释放该集合当中所有的对象;
4、确保有多少个 alloc, copy, mutableCopy 或 retain 消息就有多少 release 或 autorelease 消息发送给该对象。换句话说,确保您代码的平衡;
5、在访问方法设置属性时先保持,再释放;
6、在程序中用 @"..." 结构创建的 NSString 对象是有效常量,向它们发送 retain 或者 release 消息没有用;
7、使用便利构造方法创建的对象(如 NSString 的 stringWithFormat )可以被认为会自动释放;

8、在使用你自己的参数实例时,需要实现 -dealloc 方法来释放。

9.在使用xib对象的时候,比如IBOutlet UIImageView *imageview;要记得在dealloc函数加入[imageview release];因为xib会使引用计数加1

10.在使用leaks检测工具检测内存泄露的时候,如果它说你某个对象内存泄露,不一定是这个对象内存泄露,也有可能是类内部存在内存泄露


if (syncTimer) {
        [syncTimer invalidate]; //已经release
        //[syncTimer release];
        syncTimer = nil;
    }

如果线程里面有死循环,用判断语句break掉,在结束进程,才能释放内存

NSThread不要使用跟界面(UIImage)之类的对象,否则可能导致内存泄露

释放对象是有顺序的,先释放那些没有被谁使用的对象
你如AudioQueueRef,audioArray先释放AudioQueueRef

NSTimer在类中会导致不会调用delloc,所以先time invalidate,再调用delloc
[[NSNotificationCenter defaultCenter]removeObserver:self];
AudioQueueRef这些对象有专门的释放方法


build -> build and analiyz

多线程一定要重新开启自动释放池
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

如果系统函数发生内存泄露,一定要多观察,是不是autorelease的原因
或者调用其他函数或者其他对象引起

对于系统函数调用,到底引用计数发生了什么变化了?

函数调用,是改变指针,引用计数

最好在一个函数内,操作一个对象,不要使它的使用范围变广

有时候多个对象的嵌套会使内存管理变复杂,可以先试图简化这种关系

instrument所报的内存错误,可能是由它的容器引起的,比如array,dictor。。
没有释放,导致计数器加1
    NSLog(@"%d",[myInt retainCount]);//1
    [array addObject:myInt];
    NSLog(@"%d",[myInt retainCount]);//2
    [array release];
    NSLog(@"%d",[myInt retainCount]);//1
    [array removeLastObject];
    NSLog(@"%d",[myInt retainCount]);//0

如果在判断语句中,有内存管理一定要小心

需要使用的就不能释放

这样赋值不能使引用计数加1
rcDictionary = lrcInfo.lrcDictionary;
            [lrcInfo.lrcDictionary retain];
            [lrcInfo.lrcDictionary release];


exc_bad 多次释放release
注意需要返回的值就用autorelease
对象里面还有对象该如何release

有多少alloc就有多少dealloc
针对foundation框架
NSString
substringWithToIndex:i 使用前先判断 i 有没有超出范围
substringWithRange:range 使用前先判断range的范围
使用NSString之前先判断是否为空

没有解决的问题
    if(n+1 != lrcLength)
            lrcString =  [lrc substringWithRange:NSMakeRange(n+1, endNumber - n-1)];
        else lrcString = @"";