更改 CFDataRef 的字节时,iOS 6 上的 EXC_BAD_ACCESS 但不是 5
Posted
技术标签:
【中文标题】更改 CFDataRef 的字节时,iOS 6 上的 EXC_BAD_ACCESS 但不是 5【英文标题】:EXC_BAD_ACCESS on iOS 6 but not 5 when changing bytes of a CFDataRef 【发布时间】:2012-09-20 15:03:13 【问题描述】:我有一个应用程序可以对图像应用各种过滤器。它在 ios 5 上运行良好,但在 6 上崩溃。下面是它崩溃的示例:
CGImageRef inImage = self.CGImage;
CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);
int length = CFDataGetLength(m_DataRef);
for (int i=0; i<length; i+=4)
if(filter == filterCurve)
int r = i;
int g = i+1;
int b = i+2;
int red = m_PixelBuf[r];
int green = m_PixelBuf[g];
int blue = m_PixelBuf[b];
m_PixelBuf[r] = SAFECOLOR(red); // <==== EXC_BAD_ACCESS (code = 2)
m_PixelBuf[g] = SAFECOLOR(green);
m_PixelBuf[b] = SAFECOLOR(blue);
当我尝试将值分配回m_PixelBuf
时,请注意错误的访问点。有人知道为什么会这样吗? iOS 6 中的什么会导致这种情况?
【问题讨论】:
您在使用 ARC 吗?SAFECOLOR()
是什么?记录 RGB 值以确保您的数组索引正确。
你能提供完整的错误吗?
我没有使用 ARC... SAFECOLOR 是 #define SAFECOLOR(color) MIN(255,MAX(0,color))。完整的错误是“线程 12:EXC_BAD_ACCESS (code=2, address=0x4f50020)”,这就是我得到的全部内容,控制台中没有显示任何内容
Loggin r,g,b 和 red, green, blue vars 结果 red = 81 |绿色 = 52 |蓝色 = 151 2012-09-20 11:40:54.912 FBPhotoShare[1478:722b] r = 0 | g = 1 | b = 2
【参考方案1】:
这样就解决了问题:http://www.iphonedevsdk.com/forum/iphone-sdk-development/108072-exc_bad_access-in-ios-6-but-not-in-ios-5.html
在 iOS 6 中,如果要直接操作数据的字节,则需要使用 CFDataCreateMutableCopy()
(而不是 CGDataProviderCopyData()
),然后是 CFDataGetMutableBytePtr()
(而不是 CFDataGetBytePtr()
)。
【讨论】:
【参考方案2】:这是您找到适用于 ios 6 的新类的网址:https://github.com/kypselia/ios-image-filters/blob/6ef9a937a931f32dd0b7b5e5bbdca6cce2f690dc/Classes/ImageFilter.m
【讨论】:
以上是关于更改 CFDataRef 的字节时,iOS 6 上的 EXC_BAD_ACCESS 但不是 5的主要内容,如果未能解决你的问题,请参考以下文章
将 NSData 转换为! swift 2.0 中的 CFDataRef
如何以 unicode (BE) 格式将数据存储在 CFDataRef 中?