DOS_OBJECT_USE_OBJC
2015-12-08 14:43
1426 查看
原文:http://www.taofengping.com/2014/09/09/leak-GPUImage_cocoapods/#.VmY9PIRSbKo
GPUImage的作者BardLarson已经merge了我的RP, 该问题已解决。 不过既然都到这里了,我还是建议看完这篇文章,或许对你有帮助:P
事情的起因是产品出了一个需求,要对Camera做实时模糊的效果。
首先我想到的是用GPUImage来做,但是在使用GPUImage滤镜的时候发现每次都会出现内存泄露,而且几乎所有滤镜都会有泄漏。后来想到了CoreImage内置了模糊的滤镜,而且CoreImage也支持硬件加速,于是放弃了GPUImage的方案,用CoreImage取而代之(iOS8已经支持自定义Kernel了,感兴趣的可以移步这里)。
就在前几天在github上看到有朋友已经找到了上文中我提到的leak原因,并且提到了解决方案(不想看一大堆废话的可以直接看这里)。不敢私藏,写出来和大家一起分享。
我们知道GCD中的对象在6.0之前是不参与ARC的,而GPUImage目前支持最低的iOS版本是4.3,并且用到了ARC,因此Brad Larson在GPUImage里,用了一些条件编译来实现在iOS6.0之前GCG对象的手动释放。
GPUImage中的条件语句如下:
这里判断了当前系统支持的最小版本是否小于6.0,如果你在管理第三方库的时候没有用到Cocoapods,那应该说大多数情况下这么判断是没有问题的。但是如果用到了Cocoapods,细心的你会发现在GPUImage的pod里,compile sources的flag中多了一项
查了一下关于
我们发现恰恰是因为这一行定义,禁止了当前文件中的GCD对象参与ARC。至此,泄露的原因已经找到。事实上较好的做法是通过检查
但问题是我们还得用Cocoapods来管理所有第三方库啊!或许你可以这样:
1、设置pod时将将GPUImage的git地址改为我的分支,这里我将用到的条件语句改为了推荐的
2、偷懒的办法,fork GPUImage之后将.podspec文件中
因此,如果你的项目使用Cocoapods来管理第三方库,那就有必要稍微花点时间检查一下,确保没有出现因上述问题而造成的内存泄露。
Over.
GPUImage的作者BardLarson已经merge了我的RP, 该问题已解决。 不过既然都到这里了,我还是建议看完这篇文章,或许对你有帮助:P
事情的起因是产品出了一个需求,要对Camera做实时模糊的效果。
首先我想到的是用GPUImage来做,但是在使用GPUImage滤镜的时候发现每次都会出现内存泄露,而且几乎所有滤镜都会有泄漏。后来想到了CoreImage内置了模糊的滤镜,而且CoreImage也支持硬件加速,于是放弃了GPUImage的方案,用CoreImage取而代之(iOS8已经支持自定义Kernel了,感兴趣的可以移步这里)。
就在前几天在github上看到有朋友已经找到了上文中我提到的leak原因,并且提到了解决方案(不想看一大堆废话的可以直接看这里)。不敢私藏,写出来和大家一起分享。
我们知道GCD中的对象在6.0之前是不参与ARC的,而GPUImage目前支持最低的iOS版本是4.3,并且用到了ARC,因此Brad Larson在GPUImage里,用了一些条件编译来实现在iOS6.0之前GCG对象的手动释放。
GPUImage中的条件语句如下:
- (void)dealloc { [self destroyDataFBO]; #if ( (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) || (!defined(__IPHONE_6_0)) ) if (movieWritingQueue != NULL) { dispatch_release(movieWritingQueue); } if( audioQueue != NULL ) { dispatch_release(audioQueue); } if( videoQueue != NULL ) { dispatch_release(videoQueue); } #endif }
这里判断了当前系统支持的最小版本是否小于6.0,如果你在管理第三方库的时候没有用到Cocoapods,那应该说大多数情况下这么判断是没有问题的。但是如果用到了Cocoapods,细心的你会发现在GPUImage的pod里,compile sources的flag中多了一项
DOS_OBJECT_USE_OBJC=0。
查了一下关于
DOS_OBJECT_USE_OBJC的解释:
我们发现恰恰是因为这一行定义,禁止了当前文件中的GCD对象参与ARC。至此,泄露的原因已经找到。事实上较好的做法是通过检查
OS_OBJECT_USE_OBJC,因为在上述这种特定的条件下版本检测并不是完全通用。
但问题是我们还得用Cocoapods来管理所有第三方库啊!或许你可以这样:
1、设置pod时将将GPUImage的git地址改为我的分支,这里我将用到的条件语句改为了推荐的
OS_OBJECT_USE_OBJC,检查特性而不是检查版本。
2、偷懒的办法,fork GPUImage之后将.podspec文件中
deployment_target设置为6.0或以上,更新一下pod。
因此,如果你的项目使用Cocoapods来管理第三方库,那就有必要稍微花点时间检查一下,确保没有出现因上述问题而造成的内存泄露。
Over.
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器