iOS 关于内存自动释放池的一个问题(MRC)
2015-05-28 13:15
633 查看
之前遇上这么一个题目
for (int i = 0 ; i < 1000 ; i ++)
{
NSString *string =@"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@", string);
}
然后问我会输出什么?会有什么问题?
第一反应自然是小写的abcxyz一千遍。
第二问,我一开始有思考过是否和内存相关,但并不确定。
一个NSString这么写,就相当于把他添加到了自动释放池(autorelease),然而,添加到自动释放池并不代表他立刻释放或者销毁。
所以,循环一千遍的时候(也有可能是更大数),string会不停的添加到自动释放池,而自动释放池的内存没有release。
当内存空间被耗尽,而自动释放池没有被释放,就会导致内存溢出。
下面的答案来自百度的搜索:
目前的解决方法就是在循环里面加个自动释放池
for (int i =0; i < someLargeNumber; i++)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *string =@"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@", string);
[pool release];
}
以下两个图片来自我亲自的测试,可以对比一下
for (int i = 0 ; i < 1000 ; i ++)
{
NSString *string =@"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@", string);
}
然后问我会输出什么?会有什么问题?
第一反应自然是小写的abcxyz一千遍。
第二问,我一开始有思考过是否和内存相关,但并不确定。
一个NSString这么写,就相当于把他添加到了自动释放池(autorelease),然而,添加到自动释放池并不代表他立刻释放或者销毁。
所以,循环一千遍的时候(也有可能是更大数),string会不停的添加到自动释放池,而自动释放池的内存没有release。
当内存空间被耗尽,而自动释放池没有被释放,就会导致内存溢出。
下面的答案来自百度的搜索:
for (int i =0; i < someLargeNumber; i++)
{
NSString *string =@"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@", string);
}
问题处在每执行一次循环,就会有一个string加到当前nsrunloop中的自动释放池中,只有当自动释放池被release的时候,自动释放池中的标示了autorelease的这些数据所占用的内存空间才能被释放掉。假设,当someLargeNumber大到一定程度时,内存空间将被耗尽而没有被释放掉,所以就出现了内存溢出的现象。
目前的解决方法就是在循环里面加个自动释放池for (int i =0; i < someLargeNumber; i++)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *string =@"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@", string);
[pool release];
}
以下两个图片来自我亲自的测试,可以对比一下
相关文章推荐
- 一个关于AVPlayer蛋疼的释放问题(iOS 9.0 AVPlayer的使用与内存的释放问题)
- iOS NSHashTable NSHashTableWeakMemory自动释放内存问题详解
- 关于查找iOS中App路径时所要注意的一个问题
- 关于查找iOS中App路径时所要注意的一个问题
- 关于查找iOS中App路径时所要注意的一个问题
- 关于free如何知道要释放内存空间的长度问题
- iOS arc(自动释放)和mrc(手动释放)下重写set方法
- 关于IOS 的内存有优化问题
- 关于iOS的自动弹出键盘问题
- ios 关于AleartView 自动取消的问题
- iOS开发C语言关于内存问题的总结
- IOS开发笔记之十七——一个关于工程目录读写权限的问题
- 一个关于多线程对象释放的问题
- 关于js自动添加input元素的一个问题
- 关于一个CS项目,jvm内存溢出问题的解决方案
- [CALayer release]: message sent to deallocated instance iOS内存过度释放问题
- 一个关于unity3d中ios设备多点触控顺序的问题
- 解决了一个ios真机上的内存越界问题
- 关于iPhone/iPad的iOS系统自动弹出认证窗口问题
- 关于自动释放池@autoreleasepool 面试提经常出的问题