我想我只是犯了一个根本性的错误,但我一辈子都看不到它。
我正在从 C++ 类(已锁定)中调用 Objective-C 对象的方法。我正在使用 NSInvocation 来防止我不得不编写数百个方法来访问另一个对象中的数据。
这些是我正在经历的步骤。这是我的第一个电话,我想通过s2
。我真的不能提供一个可编译的例子,但希望这只是我的一个 DUHRRRRR 问题。
float s2[3];
id args2s[] = {(id)&_start.x(),(id)&_start.y(),(id)&s2};
_view->_callPixMethod(@selector(convertPixX:pixY:toDICOMCoords:),3,args2s);
这是被调用的 View 方法
invokeUnion View::_callPixMethod(SEL method, int nArgs, id args[])
{
DataModule* data;
DataVisitor getdata(&data);
getConfig()->accept(getdata);
invokeUnion retVal;
retVal.OBJC_ID = data->callPixMethod(_index, _datasetKey, method, nArgs, args);
return retVal;
}
Invoke Union 是一个联合,因此我可以获得 NSInvocation 返回的浮点值。
union invokeUnion {
id OBJC_ID;
int intValue;
float floatValue;
bool boolValue;
};
这是数据对象中的方法(pthread 用 lock() 和 unlock() 锁定);
id DataModule::callPixMethod(int index, std::string predicate, SEL method, int nArgs, id args[] )
{
// May Block
DCMPix *pix =[[getSeriesData(predicate) pix] objectAtIndex:index];
lock();
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMethodSignature *signature;
NSInvocation *invocation;
signature = [DCMPix instanceMethodSignatureForSelector:method];
invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:method];
[invocation setTarget:pix];
if (nArgs > 0) for (int n = 0; n < nArgs; n++) {
SFLog(@"invocation: i=%d, *ptr=0x%x, valf=%f, vald=%d",n,args[n],*args[n],*args[n]);
[invocation setArgument:args[n] atIndex:2+n];
}
id retVal;
[invocation invoke];
[invocation getReturnValue:&retVal];
[pool release];
unlock();
return retVal;
}
DCMPix 对象中的方法(我无法修改,它是库的一部分)如下:
-(void) convertPixX: (float) x pixY: (float) y toDICOMCoords: (float*) d pixelCenter: (BOOL) pixelCenter
{
if( pixelCenter)
{
x -= 0.5;
y -= 0.5;
}
d[0] = originX + y*orientation[3]*pixelSpacingY + x*orientation[0]*pixelSpacingX;
d[1] = originY + y*orientation[4]*pixelSpacingY + x*orientation[1]*pixelSpacingX;
d[2] = originZ + y*orientation[5]*pixelSpacingY + x*orientation[2]*pixelSpacingX;
}
-(void) convertPixX: (float) x pixY: (float) y toDICOMCoords: (float*) d
{
[self convertPixX: x pixY: y toDICOMCoords: d pixelCenter: YES];
}
它在尝试访问时崩溃d[0]
。 BAD_EXC_ACCESS
我知道这意味着它正在访问已释放的内存或超出其范围的内存。
我迷失了跟踪指针的指针。这两个浮点值很好(与其他方法中的其他信息一样),但这是唯一一个要求 afloat*
作为参数的值。据我了解,该convertPixX:
方法是从为 Mac OS 9 编写的 C 程序转换而来的……这就是为什么它要求将 c 数组作为out
值……我想。
无论如何,任何见解将不胜感激。
我试过发送这样的值:
float *s2 = new float[3];
void* ps2 = &s2;
id args2s[] = {(id)&_start.x(),(id)&_start.y(),(id)&ps2};
_view->_callPixMethod(@selector(convertPixX:pixY:toDICOMCoords:),3,args2s);
但这给出了一个SIGKILL
- 加上我确信它是虚假和错误的。......但我试过了。
无论如何...指针!跨语言!啊!
谢谢,