博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oc面试 内存泄露
阅读量:5908 次
发布时间:2019-06-19

本文共 1272 字,大约阅读时间需要 4 分钟。

这段代码有什么问题,如何修改for (int i = 0; i < someLargeNumber; i++) {NSString *string = @”Abc”;string = [string lowercaseString];string = [string stringByAppendingString:@"xyz"];NSLog(@“%@”, string);}

======================================================

老实说,当看到这块代码的时候,怎么也没发现问题。

假如说someLargeNumber趋于无穷大,得产生无穷个NSString类型的string。

先说一下堆栈之间的区别:

(1)管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。(2)申请大小:能从栈获得的空间较小,堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。(3)碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出(4)分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。(5)分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

由此可见,频繁的开辟内存空间,并释放内存那必然会导致内存泄漏。

我们看一下修改后的代码

for(int i = 0; i<1000;i++){					NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];NSString *string = @"Abc";string = [string lowercaseString];string = [string stringByAppendingString:@"xyz"];NSLog(@"%@",string);					//释放池					[pool1 drain];} 

在oc中,我们提到过NSAutoreleasePool这个东西,在NSAutoreleasePool中的元素实际上都被默认的变成了autoRelease,更好的让内存得到释放。

转载于:https://www.cnblogs.com/fantasy3588/p/5444246.html

你可能感兴趣的文章
为MFC界面添加一个Log Window
查看>>
使用 Windows PowerShell 来管理和开发 windowsazure.cn 账户的特别注意事项
查看>>
【转】每天一个linux命令(31): /etc/group文件详解
查看>>
wince程序调用另外一个wince exe程序?
查看>>
NSThread 、NSRunLoop 和 Dispatch Queue
查看>>
改成maven工程
查看>>
开发微信支付上线二个月后的总结
查看>>
平衡工作与生活的艺术——GTD简单介绍
查看>>
apache2.2 虚拟主机配置
查看>>
关于android:configChanges的属性
查看>>
iotop
查看>>
angular多个控制器如何共享数据
查看>>
Ogre Compositor解析
查看>>
SQLServer 2008以上误操作数据库恢复方法——日志尾部备份
查看>>
[转]强制取消TFS2008中其它成员的签出文件
查看>>
Dapper - .Net 环境下一个简单对象映射的框架
查看>>
CSS SANS – 神奇!使用 CSS3 创建的字体
查看>>
很好的理解遗传算法的样例
查看>>
Retrofit
查看>>
java设计模式1--工厂方法模式(Factory Method)
查看>>