【发布时间】:2012-07-22 23:55:32
【问题描述】:
对于以下代码,本质上,我们在 ObjectiveC 中调用 C 函数(funca 和 funcb)并使用 C 指针 pX。出于某种原因,我们在调用 funcb 时点击了 EXC_BAD_ACCESS,我们认为这可能与 pX 被释放或其他一些内存问题有关。所以问题是,这里可能出了什么问题?如果真的是因为那个 pX 提前发布了,我们怎么能修复它呢?在 ObjectiveC 中做 C 的一般做法是什么,就像这个场景一样?
.h
@interface MyObject : NSObject {
X *pX;
}
.m
// calling funca and get the value pX properly set
if (funca(&pX) != 0) {
// error;
}
// use the pX returned from funca
funcb(pX, ...);
【问题讨论】:
-
funca是什么样的?我怀疑funca(&pX)这条线 :) 你在哪里为*pX分配内存-C 分配没有ARC,所以如果它提前发布,那是因为你调用了free -
我们不拥有 funca 和 funcb,它们来自 3rd 方库。 *pX 在funca内部分配。
-
哦。在那种情况下,看起来你做得对:) 你是否 100% 确定 MyObject 没有被释放(提前发布等?)
-
MyObject 被保留,所以我很确定它当时没有发布。 :) 会不会是某种内存对齐问题导致 EXC_BAD_ACCESS 问题?
-
作为健全性检查,我会在调用
funca之前立即将pX初始化为NULL,然后立即记录其值(使用%#x 格式)。在调用funcb之前重复此过程(假设调用在不同的范围内)。
标签: objective-c c pointers memory-management