2013-05-04 26 views
0

我有一个简单的函数来创建具有特殊尺寸的UIImage:为什么小小的内存泄漏FUNC相关UIGraphicsBeginImageContext?

- (UIImage*)imageWithSize:(CGSize) imSize 
{ 
    UIGraphicsBeginImageContext(imSize); 

    float r = 0.5f; 
    float g = 0.5f; 
    float b = 0.5f; 

    CGContextRef cxt = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(cxt, r, g, b, 1.0); 
    CGContextSetRGBFillColor(cxt, r,g,b, 1.0); 
    CGContextFillRect(cxt, CGRectMake(0.0, 0.0, imSize.width, imSize.height)); 

    UIImage* retImg = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return retImg; 
} 

,然后我把它称为多次以这种方式(我使用ARC):

for(int i=0;i<3000;i++) 
{ 
    UIImage* im = [self imageWithSize:CGSizeMake(256,192)]; 
} 

它将接收内存警告多次,然后崩溃在我的iPhone4;( 任何错误的简单功能?

回答

2

这是典型的使用没有本地自动释放池的大型循环

由于你的函数不会返回控制到主循环,从而使操作系统有机会排出自动释放的对象池,内存占用一直无限增长。

这将是使用本地自动释放池的方式,并在循环在每个迭代释放不需要对象(尽管这种“学案”可能是矫枉过正):

for(int i=0;i<3000;i++) 
{ 
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init]; 
    UIImage* im = [self imageWithSize:CGSizeMake(256,192)]; 
    [loopPool release]; 
} 

或者你可以使用更新的语法:

@autoreleasepool { 
     .... 
    } 
+0

宾果和谢谢! – tabamilk 2013-05-04 11:05:01