OC 内存泄露 自动释放池

有这么一段代码:largeNumber可以当做一个很大的数

花絮:看到下面的代码就想起这么一个笑话:

  一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法。提笔思索良久后在纸上写下:Hello world!

for (int i = 0 ; i < largeNumber; i++) {
    NSString *myStr = @"Hello world"; // 原谅我用Hello world
    myStr = [myStr stringByAppendingString:[NSString stringWithFormat:@"-%05d-",i]];
}

  那么会有什么问题呢?

  如果largeNumber不大时没有问题,但是当它很大时问题非常严重!造成内存泄露。虽然ARC会自动释放内存,但是ARC内存的释放,即全局的自动释放池是当完成一次消息循环才会释放。当我们使用for循环创建很多个使用autorelease方式创建的NSString对象的时候,将所有的对象的释放权都交给了一个全局的释放池(RunLoop 的释放池),而RunLoop的释放池会等待这个事件处理之后才会释放,因此就会使对象无法及时释放,堆积在内存造成内存泄露。

  代码应该这样修改:添加一个局部的自动释放池,那么每执行一次循环就会释放一次,则不会造成内存泄露

for (int i = 0 ; i < largeNumber; i++) {
    @autoreleasepool {
        NSString *myStr = @"Hello world";
        myStr = [myStr stringByAppendingString:[NSString stringWithFormat:@"-%05d-",i]];
    }
}
时间: 2024-10-20 00:35:01

OC 内存泄露 自动释放池的相关文章

Objective-C(十六、内存管理,自动释放池,ARC,强指针,弱指针,方法族)——iOS开发基础

结合之前的学习笔记以及参考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,只是作为参考,以苹果官方文档为准~ 十六.内存管理相关知识(二) 1.autorelease,自动释放机制 - (instancetype)autorelease; (1)自动释放池的创建 iOS5.0之前 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //进行一系列操作 //此处不可以使用

OC基础笔记——自动释放池

autorelease:延长对象生命周期 把对象放到离自己最近那个自动释放池中 当自动释放池销毁的时候,它会把放在其中所有对象进行一次release的操作 它和对象在哪里创建没有关系 自动释放池的原理: 1.系统中存在一个自动释放池栈, 当遇到 @autoreleasepool { 把这个自动释放池压入栈中 2.但遇到与之对应 } 自动释放池,出栈,它出栈的时候,会对池中所有对象进行一次release操作 3.自动释放池栈中,只有栈顶自动释放池是活动的,其他的都在休眠 4.当你调用autorel

黑马程序员-OC学习笔记之autorelease与自动释放池

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.autorelease autorelease与release相似,是OC中的一个对象方法.这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误:而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动

OC_内存管理(二)对象复制、循环引用问题、自动释放池

循环调用: 1.循环引用的问题 两个对象A.B,有可能会出现特殊情况:A中包含B的实例变量:B中也包含A的实例变量,如果这两个实例变量都是强引用(A有着B的实例变量所有权,B也有A的实例变量所有权),然后在两个对象销毁时,会出现A.B都不能正常销毁的情况.下面用代码来演示循环调用问题: ClassA的头文件Class.h代码 #import <Foundation/Foundation.h> //类的前向声明 @class ClassB; //类的前向声明与包含头文件的区别?Q: @inter

手动内存管理和自动释放池

手动内存管理 在进行内存管理的时候要注意内存管理的准则:谁开辟内存,谁释放内存(谁污染的谁治理) .开辟内存之后,对象的引用计数为1,只有继承自NSObject的对象才有内促管理的概念, 当对象引用计数为0的时候对象的内存会被清理. 下列关键字会开辟内存,对象引用计数器+1 alloc new copy mutableCopy 下列是内存管理的相关方法. retain :保留对象,对象的引用计数器+1. release : 释放对象,对象引用计数器-1. retainCount : 获取对象当前

Objective-C(8)内存管理之自动释放池

自动释放池 是一种半自动的内存管理方式 autorealease方法: - (instancetype)autorelease 此方法将对象放到自动释放池中,当自动释放池销毁时,池中的所有对象都会随之销毁. 常见的使用方式: Person *p = [[[Perosn alloc] init] autorelease]; 使用@autoreleasepool关键字来使用自动释放池 其后的{-}相当于自动释放池的生存期 ,如: @autoreleasepool {      Person *p =

objective-C 的内存管理之-自动释放池(autorelease pool)

如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候不再使用并不那么容易.如果下面的代码,看上去非常简单: Sample.h类接口部分 #import @interface Sample : NSObject { } -(NSString*) toString; @end Sample.m 类实现部分 #import "Sample.h"

黑马程序员----内存管理之四——《autorelease自动释放池》

内存管理之四——autorelease自动释放池 1.autorelease的基本使用 此对象方法会将对象放到一个自动释放池内: 当自动释放池被销毁时,就会对池子内的所有对象做一次release操作: 此方法会返回对象本身: 调用完此方法后,对象计数器的值不变,只有到自动释放池被销毁时才会对对象做一次release操作: 2.autorelease的好处 不用在关心对象被销毁的时间: 不用关心什么时候调用release操作: 3.autorelease的使用注意 占用内存较大的对象不要随便使用a

OC基础(十三)autorelease自动释放池

autorelease 自动释放池 autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 优点:不用再关心对象释放的时间,不用再关心什么时候调用release 原理:autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该 Object放入了当前的autorelease pool中,当该pool被