同步NSMutableData问题

时间:2011-09-21 13:27:28

标签: objective-c core-foundation

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

我们通过pthread互斥锁同步访问此NSMutableData对象:

pthread_mutex_t _mutex;

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

然后每当我们访问此对象时,我们都会:

pthread_mutex_lock(&_mutex);
const UInt8* rawData = [_coverage bytes];
//code that works with the raw bytes
pthread_mutex_unlock(&_mutex);

此外,我们在将数据添加到NSMutableData对象之前锁定了互斥锁的每个addData方法。

问题是我们在使用EXC_BAD_ACCESS时偶尔会遇到rawData。我知道NSMutableBytes会在数据添加到它时增加其字节数组。我也明白,我不应该期望rawData神奇地成长。

我只是想知道当我们明确锁定读取和写入访问权限时,我们如何能够进入rawData从我们这里免费的情况?

我们是否在使用互斥锁或我们访问字节的方式出错了?

修改

我发现了获得EXC_BAD_ACCESS的真正原因。我没有初始化互斥锁属性,所以锁定互斥锁什么也没做。这是更正后的代码:

pthread_mutex_t _mutex;

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

1 个答案:

答案 0 :(得分:1)

是的,可能会从你身下释放出来。

根据documentation

  

<强>字节
  返回指向接收者内容的指针。

您应该复制数据,以确保不会更改或从您的下方释放。完成复制后,请确保free()

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);