3

我想将 Objective-C 对象的属性相互绑定,但属性是 c++ 类。该属性实际上是一个数学向量类,它更易于使用,因为运算符重载对向量数学非常有用。(我什至没有看到使用 Objective-C 对象的向量数学的好方法,有吗?)

问题是绑定此向量属性会使应用程序崩溃。这是一个例子:

@interface M_Node : NSObject{
Vec3f pos;
M_Node *manipulator
}
@property Vec3f pos;
@end

@implementation
@synthesize pos;

@dynamic pos;
-(void)setPos:(Vec3f)newPos{
pos=Vec3f(newPos);
}
-(Vec3f)pos{
return Vec3f(pos);
}

- (id) init
{
self = [super init];
if (self != nil) {
[self bind:@"pos" toObject:self withKeyPath:@"manipulator.pos" options:nil];
}

return self;
}

Xcode的问题:'Vec3f'(又名'Vec3')类型的原子属性使用非平凡赋值运算符合成setter

我使用 cinder 中的 Vec3f 类:http: //libcinder.org/docs/v0.8.3/classcinder_1_1_vec3.html

所以问题是如何将 c++ 对象绑定为objective-c 中的属性,甚至有可能吗?还有其他方法吗?(如果您知道如何在 Objective-c 中进行干净的向量、矩阵等数学运算,请告诉我。)

这是我在文档中找到的:

标量和结构值的 KVC 转换 KVC 方法 valueForKey: 和 setValue:forKey: 的默认实现支持标量数据类型(如 BOOL、char、double、float、int 和 NSPoint、NSRange 和 NSRect 等结构)的自动对象包装。当 Cocoa 脚本调用 valueForKey: 来获取一个值时,如果需要,KVC 会自动将该值转换为 NSNumber 对象(对于标量)或 NSValue 对象(对于结构)。同样, setValue:forKey: 确定指定键的适当访问器或实例变量所需的数据类型。如果数据类型不是对象,则使用适当的 NSNumber 或 NSValue 方法从传递的对象中提取值。有关更多信息,包括支持的类型表,请参阅 Key-Value Coding Programming Guide 中的 Scalar and Structure Support

尽管如此,还是有像 NSRect 这样的结构的包装器。可能有一种方法可以覆盖原始 valueForKey: 所以它也可以处理 Vec3f。

所以这将是一个新问题:如何覆盖valueForKey:setValue: forKey:以便能够处理我自己的 c++ 对象?

4

1 回答 1

1

我非常怀疑这会奏效。

Bindings 建立在键值编码 (KVC) 和键值观察 (KVO) 之上。您正在使用manipulator.pos. 这意味着该manipulator属性必须是一个符合 KVC 和 KVO 的 Objective-C 对象pos。目前尚不清楚,但我怀疑这M_Node是一个 C++ 类,而不是 Objective-C 类,因此任何东西都不符合 KVC 或 KVO。

接下来是 KVC 将如何返回并传递pos是否可以到达它的值的问题。KVC 将包装非对象数据类型NSNumberNSValue传递它们。但是,如果 aVec3f不是 POD,那么我怀疑它是否能正常工作。

归根结底,绑定并不神奇(尽管无可否认,KVO 在其实现中有一些近乎神奇的 isa-swizzling 东西)。关键是,你认为这[[yourObject valueForKey:@"manipulator"] valueForKey:@"pos"]会奏效吗?你希望[[yourObject valueForKey:@"manipulator"] setValue:someValue forKey:@"pos"]工作吗?如果没有,那么绑定就不可能起作用。

于 2012-06-13T15:28:59.767 回答