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 )可以被认为会自动释放;
多线程一定要重新开启自动释放池
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 = @"";
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这些对象有专门的释放方法
多线程一定要重新开启自动释放池
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 = @"";
- Objective-C内存管理总结
- Objective-c内存管理总结
- Objective-C内存管理总结
- Objective-C内存管理总结 iphone
- objective-c内存管理一点总结
- objective-c 编程总结 内存管理
- Objective-c内存管理学习总结
- Objective-C内存管理总结
- 【黑马程序员】---Objective-C内存管理总结
- #Objective - C - OC内存管理总结
- #Objective - C - Eighth-day 内存管理总结
- objective-c内存管理
- Objective-c 内存管理
- Objective-C内存管理~~
- Objective-C内存管理
- Objective-C 内存管理
- Objective-C 内存管理
- Objective-C 内存管理
- STL之父访谈录(一万二千字的大块头)---孟岩翻译
- Linux系统的Shell I/O重定向详解
- 虚拟机ubuntu与本地win7实现文件共享
- 从浏览器访问一个地址的过程
- Android在Ubuntu10.04上的搭建
- Objective-c内存管理总结
- c++ 复数运算
- 素数
- C++Primer第三版习题0326
- CNAME和DNS智能解析过程
- org.hibernate.MappingException: duplicate property mapping:
- Android ---- WebView与JavaScript交互调用(2)
- 类的初始化顺序实例
- ACM经典签名