2012-06-13 66 views
3

我想綁定到對象的Objective-C對象屬性,但屬性是C++類。該屬性實際上是一個數學向量類,它更容易處理,因爲運算符重載對向量數學非常有用。 (我甚至沒有看到與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「(又名「VEC 3」)合成二傳手用不平凡的賦值運算符

的 原子屬性我使用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++對象?

+0

在初始化程序中,是否嘗試將[self bind:etc ...放在if(self!= nil)塊中?塊之外的任何東西都意味着自己可能是零,並且編譯器會踢。 – Patrick

+0

實際上這是一個打字錯誤。原來在if區塊內。我甚至試圖從外面綁定兩個完全獨立的對象。它仍然崩潰。 – zalavari

+0

你有沒有嘗試過自己實施制定者? – zneak

回答

1

我非常懷疑這會起作用。

綁定建立在鍵值編碼(KVC)和鍵值觀察(KVO)上。您正在使用manipulator.pos的關鍵路徑。這意味着manipulator屬性必須是屬於pos屬性的KVC和KVO兼容的Objective-C對象。目前尚不清楚,但我懷疑M_Node是一個C++類,而不是Objective-C類,因此對任何事情都不是KVC或KVO兼容的。

接下來是如何KVC將返回並通過pos的價值,如果它可以得到它的問題。 KVC會將非對象數據類型包裝在NSNumberNSValue中以傳遞它們。但是,如果Vec3f是非POD,那麼我懷疑它會工作得很好。最終,綁定並不是魔術(雖然,不可否認,KVO在其實現方面有一些近乎魔術般的混亂的東西)。關鍵是,你會期待[[yourObject valueForKey:@"manipulator"] valueForKey:@"pos"]會起作用嗎?你期望[[yourObject valueForKey:@"manipulator"] setValue:someValue forKey:@"pos"]工作?如果沒有,那麼就沒有機會綁定了。

+0

嗯,我想你明白了。 – zalavari

+0

我發現了一種可能會奏效的方法。 (實際上,stackoverflow不允許我回答我的問題,所以我會在頂部更新它 – zalavari

+0

我提到了你的想法,但因爲它有工作的祈禱,所以'Vec3f'必須是[ POD(普通的舊數據)](http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.7) –

相關問題