ios image drawInRect内存暴增

在UIImage处理中,时常会使用到drawInRect方法,但是缺点是内存占用过大,且造成内存泄漏无法回收。这一点是因为对象持有,导致不能及时释放的原因。
多调用几次这个方法,内存就暴增。尽管网络上查找问题的答案,autoRelease释放池也无法处理。

解决方法一:
将UIImage对象本地缓存成图片,然后正常释放对象UIGraphicsEndImageContext(),接着传递出去缓存UIImage的路径进行读取。

解决方法二:

将从上下文获取的新图片压缩处理成新的图片,后续都使用这个压缩后的新图片,压缩之前的从上下文获取的图片及时释放掉,话不多说,代码如下:

   UIImageOrientation imageOrientation = image.imageOrientation;
        if (imageOrientation != UIImageOrientationUp) {
                //开始上下文
                UIGraphicsBeginImageContext(image.size);
                //将相册的图片绘制到上下文上
                [image drawInRect:CGRectMake(0,0,image.size.width,image.size.height)];
                //从上下文获取已经绘制好的图片
                UIImage * tempImage = UIGraphicsGetImageFromCurrentImageContext();
                //将上下文的图片压缩
                NSData * tempImageData = UIImageJPEGRepresentation(tempImage, 0.3);
                //将压缩的数据转为图片
                tempImage = [UIImage imageWithData:tempImageData];
                //将原有的相册图片释放掉
                if (image) {
                    image = nil;
                }
                //将压缩之后的图片赋值给原有的图片地址
                image = tempImage;
                //关闭上下文
                UIGraphicsEndImageContext();
        }

instruments实测内存几乎没啥增长

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,这里是一段简单的 iOS OpenGL 代码,可以在 Xcode 中运行: ```objective-c #import <GLKit/GLKit.h> @interface ViewController : GLKViewController @property (nonatomic, strong) EAGLContext *context; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; GLKView *view = (GLKView *)self.view; view.context = self.context; view.drawableDepthFormat = GLKViewDrawableDepthFormat24; [EAGLContext setCurrentContext:self.context]; // 设置 OpenGL 状态 glClearColor(0.0, 0.0, 0.0, 1.0); // 初始化顶点数组和索引数组 GLfloat vertices[] = { -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0 }; GLuint indices[] = {0, 1, 2}; // 创建顶点缓冲对象和索引缓冲对象 GLuint vertexBuffer, indexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); } - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { glClear(GL_COLOR_BUFFER_BIT); // 启用顶点属性数组 glEnableVertexAttribArray(GLKVertexAttribPosition); glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, NULL); // 绘制三角形 glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, NULL); // 关闭顶点属性数组 glDisableVertexAttribArray(GLKVertexAttribPosition); } @end ``` 这段代码创建了一个 GLKViewController,用于管理 OpenGL 渲染上下文和视图。在 viewDidLoad 方法中,我们创建了一个 OpenGL ES 3.0 的渲染上下文,并将其绑定到 GLKView 上。然后,我们设置了 OpenGL 的状态,包括背景颜色和顶点数组。 在 glkView:drawInRect: 方法中,我们清空了颜色缓冲区,启用了顶点属性数组,并绘制了一个三角形。最后,我们关闭了顶点属性数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值