【发布时间】: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++