【问题标题】:How to bind c++ objects as properties in objective-c?如何将c++对象绑定为objective-c中的属性?
【发布时间】:2012-06-16 12:12:21
【问题描述】:

我想将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 方法从传递的对象中提取值。 有关更多信息,包括支持的类型表,请参阅键值编码编程指南中的标量和结构支持

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

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

【问题讨论】:

  • 在初始化程序中,您是否尝试将 [self bind: etc... 放在 if (self != nil) 块中?块外的任何东西都意味着 self 可能是 nil 并且编译器会启动。
  • 实际上这是一个打字错误。原件在 if 块内。我什至试图从外面绑定两个完全独立的对象。它仍然崩溃。
  • 你试过自己实现setter吗?
  • 这是我现在正在做的,但仍然崩溃。我更新了问题并包含了 getter、setter。

标签: c++ objective-c cocoa-bindings objective-c++


【解决方案1】:

我非常怀疑这会奏效。

Bindings 建立在键值编码 (KVC) 和键值观察 (KVO) 之上。您正在使用manipulator.pos 的密钥路径。这意味着manipulator 属性必须是与pos 属性的KVC 和KVO 兼容的Objective-C 对象。不清楚,但我怀疑M_Node 是 C++ 类,而不是 Objective-C 类,因此不符合 KVC 或 KVO。

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

归根结底,绑定并不是魔法(虽然,诚然,KVO 在其实现中有一些近乎魔法的 isa-swizzling 东西)。关键是,您认为[[yourObject valueForKey:@"manipulator"] valueForKey:@"pos"] 会起作用吗?你会期望[[yourObject valueForKey:@"manipulator"] setValue:someValue forKey:@"pos"] 工作吗?如果没有,那么绑定就不可能起作用。

【讨论】:

  • 我找到了一种可行的方法。 (实际上stackoverflow还不允许我回答我的问题,所以我会在顶部更新它。
  • 我提到了你的想法,但是为了让它有工作的祈祷,Vec3f 必须是POD (plain old data)
  • “不清楚,但我怀疑 M_Node 是 C++ 类,而不是 Objective-C 类” 不,M_Node 显然是 Obj-C 类。请参阅 OP 代码示例的第一行:@interface M_Node : NSObject {
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2011-01-29
  • 2012-02-23
  • 2018-11-16
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多