更改 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 中?

在 iOS 9 上更改隐藏属性时 UIStackView 不会动画

如何在 iOS 上从 Web 下载原始字节

6 IO流

如何在不更改 Xcode 版本的情况下知道 iOS 5 应用程序是不是可以在 iOS 6 上运行?