2012-01-03 64 views
3

我正在創建的OBJ-C庫綁定,這樣我可以與其他球隊一起在同一個項目。爲了確保這樣做,我試圖創建一個簡單的obj-c庫,定義綁定,並在MonoTouch中使用該對象。我沒有構建問題甚至運行時異常,但是調用任何函數的返回值始終爲空。的MonoTouch /對象 - 綁定操作方法

我開始使用Xcode中創建一個新的靜態庫,並定義了「計算器」類。 .h和.m

@interface Calculator : NSObject 
- (NSString*)getMessage; 
@end 

@implementation Calculator 
- (NSString*)getMessage 
{ 
    return @"hey, look at me!"; 
} 
@end 

將此內置到文件'libXcodeLib.a'中。我定義這個類以下MonoTouch的綁定和方法:對gcc_flags

[BaseType(typeof(NSObject))] 
interface Calculator 
{ 
    [MonoTouch.Foundation.Export("getMessage")] 
    string GetMessage(); 
} 

除了一個額外的AssemblyInfo.cs下列要求:

[assembly: LinkWith ("libXcodeLib.a", LinkTarget.Simulator | LinkTarget.ArmV6 | LinkTarget.ArmV7, ForceLoad = true)] 

最後,下面就來看看在Makefile中產生.dll文件

BTOUCH=/Developer/MonoTouch/usr/bin/btouch 
all: XcodeLib.dll 
XcodeLib.dll: Makefile ApiDefinition.cs AssemblyInfo.cs libXcodeLib.a 
$(BTOUCH) -e ApiDefinition.cs AssemblyInfo.cs --out=XcodeLib.dll --link-with=libXcodeLib.a,libXcodeLib.a 

這裏是示例代碼調用此方法:

var calc = new MTBindings.Calculator(); 
var msg = calc.GetMessage(); 

在這一點上,爲什麼味精NULL?

從所有的閱讀中,我已經做了,我看不到我錯過了什麼,使這項工作。任何新的或經過驗證的樣本/教程都將不勝感激,我不確定如何簡化這一點 - 但它仍然行不通!

得益於SO社區 - 我希望:)

+0

你可以運送你的完整樣本給我看看嗎? – 2012-01-03 12:39:15

+0

你可以測試是否通過在getMessage中添加NSLog來實現ObjectiveC方法「getMessage」,這可能會指向與你的庫鏈接問題 – JeanLuc 2012-01-03 13:40:03

回答

2

我回顧了包從馬特和我發現的是,他的圖書館是一個唯一的ARM庫。在模擬器中運行時,代碼將不會被鏈接,Objective-C喜歡在向空對象發送消息時以靜默方式繼續執行。

這是允許在Objective-C不崩潰下面的代碼:

ID富= NULL; [foo.bar.baz saySomething:@ 「你好」]

儘管富被空。在這種情況下,當代碼未能加載Calculator類時,基本上什麼都不說。所有消息都被高興地發送出去,但Objective-C運行時卻一直在繼續。

+0

作爲一個輕微的附錄,我想聲明我能夠通過編輯來解決Makefile爲每個架構構建Xcode庫項目本身,然後使用lipo進行組合。你可以在這裏看到這個(https://github.com/mono/monotouch-bindings/blob/master/facebook/binding/Makefile)。再次感謝米格爾。 – 2012-01-04 03:46:37

+3

當消息發送到不存在的對象時,Objective-C不會「悄然失敗」。發送消息到NULL通過設計返回0/NULL - 這是Obj-C開發中的一個重要模式,並且顯着簡化了錯誤檢查。但是,將消息發送到不存在的對象是非法的,並且通常會崩潰。 – StilesCrisis 2012-01-04 06:32:58