首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步NSMutableData故障

同步NSMutableData故障
EN

Stack Overflow用户
提问于 2011-09-21 13:27:28
回答 1查看 299关注 0票数 1

我们有一个NSMutableData对象,它经常附加数据。我们还经常通过bytes方法提取数据进行读取。

我们已经通过一个p线程互斥体同步访问这个NSMutableData对象:

代码语言:javascript
复制
pthread_mutex_t _mutex;

pthread_mutexattr_t attributes;
pthread_mutexattr_settype( &attributes, PTHREAD_MUTEX_DEFAULT );
pthread_mutex_init( &_mutex, &attributes );

然后每次我们访问这个对象时,我们:

代码语言:javascript
复制
pthread_mutex_lock(&_mutex);
const UInt8* rawData = [_coverage bytes];
//code that works with the raw bytes
pthread_mutex_unlock(&_mutex);

另外,在向addData对象添加数据之前,我们拥有的每个NSMutableData方法都会锁定互斥对象。

问题是,在使用EXC_BAD_ACCESS时,我们仍然会得到偶尔的rawData。据我所知,随着数据被添加到NSMutableBytes中,它的字节数组将不断增长。我也明白,我不应该期望rawData也会神奇地成长。

我只是想知道,当我们显式地锁定了读写的访问权限时,我们如何才能进入这样一种情况:rawData已经从我们的下面被释放了?

我们对互斥对象做错了什么,还是访问字节的方式出错了?

编辑

我发现了我获得EXC_BAD_ACCESS的真正原因。我没有初始化互斥属性,所以锁定互斥锁没有任何作用。以下是修正后的代码:

代码语言:javascript
复制
pthread_mutex_t _mutex;

pthread_mutexattr_t attributes;
pthread_mutexattr_init(&attributes);
pthread_mutex_init(&_mutex, &attributes);
pthread_mutexattr_destroy(&attributes);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-21 13:50:18

是的,这是有可能的,是从你的下面被释放。

根据文档

字节 返回指向接收方内容的指针。

您应该复制数据,以确保数据不会被更改或从底层释放。当您完成您的副本,确保free()它。

代码语言:javascript
复制
pthread_mutex_lock(&_mutex);
const UInt8 *origData = [_coverage bytes];
UInt8 *rawData;
memmove(rawData, origData, [_coverage length]);

//code that works with the raw bytes
free(rawData);
pthread_mutex_unlock(&_mutex);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7500542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档