gpt4 book ai didi

ios - 为什么这个与 UIGraphicsBeginImageContext 相关的函数中有微小的内存泄漏?

转载 作者:行者123 更新时间:2023-11-28 22:34:54 27 4
gpt4 key购买 nike

我有一个简单的函数来创建一个特殊尺寸的 UIImage :

- (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 上崩溃;(简单功能有什么问题吗?

最佳答案

这在使用没有本地自动释放池的大型循环时很典型。

由于您的函数不会将控制权返回给主循环,从而使操作系统有机会耗尽自动释放对象池,因此内存占用会无限增长。

这将是一种使用本地自动释放池并在循环中的每次迭代中释放不需要的对象的方法(尽管对于这种“研究案例”可能有点矫枉过正):

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

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

    @autoreleasepool {
....
}

关于ios - 为什么这个与 UIGraphicsBeginImageContext 相关的函数中有微小的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16372546/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com