在我的 Cocoa 项目中,我有很多使用 malloc/free 的地方。然而几个月前我决定重构以利用 ARC,为了做到这一点,我尝试替换 malloc 它将返回指向将自动清理的东西的指针。
我使用了这个功能(错误检查和其他日志被省略)
+ (void *) MallocWithAutoCleanup: (size_t) size
{
NSMutableData * mutableData = [[NSMutableData alloc] initWithLength:size];
void * data = [mutableData mutableBytes];
return data;
}
这工作了一段时间,但最近出现了随机内存覆盖问题。我追查了这个函数的原因,似乎正在发生的事情是 NSMutableData 实例正在被释放,即使我保留了一个指向它的 mutableBytes 的指针。
我猜这是因为对对象的唯一直接引用是本地的并且正在消失,而 mutableBytes 指向对象内部,因此 ARC 不够聪明,无法处理这种引用计数。
只要使用 mutableBytes 指针(即有人引用它),有什么方法可以重构此代码以保留 mutableData 对象?我知道一种选择是只返回 NSMutableData 本身,但这需要进行大量重构并且看起来非常混乱。