我们有一个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);
答案 0 :(得分:1)
是的,可能会从你身下释放出来。
<强>字节强>
返回指向接收者内容的指针。
您应该复制数据,以确保不会更改或从您的下方释放。完成复制后,请确保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);