2011-10-21 99 views
1

以下代碼是從Stig Brautaset JSON庫中複製的 - 我刪除了更加清晰的註釋。與SBJSON庫崩潰

@interface NSString (NSString_SBJSON) 

- (id)JSONFragmentValue; 
- (id)JSONValue; 

@end 

我有當我打電話崩潰:

NSString *jsonString = [request responseString]; 
... 
NSDictionary *results = [jsonString JSONValue];//here is the crash with invalid selector. 

添加此:

if (![jsonString respondsToSelector:@selector(JSONValue)]) 
{ 
    NSLog(@"fix this!!!\n"); 
} 

並顯示該消息。你有什麼想法,爲什麼這個功能不叫?

謝謝!

編輯:我編譯JSON框架作爲靜態庫。該調用是在同一個庫中進行的。 當我將它編譯爲exe時,它運行時沒有任何問題。

+0

是你的框架在編譯時添加和複製的嗎?請參閱http://stackoverflow.com/questions/6972904/adding-a-framework-to-xcode-4 –

+0

@Marek Sebera我將JSON框架編譯爲靜態庫。我們在同一個庫中做的電話。 – Felics

+0

嘗試查找NSString擴展代碼的定義,並檢查一切都很好。 –

回答

1

您需要將您的靜態庫和最終的可執行文件鏈接到-ObjC鏈接器選項。

-JSONValue方法被實現爲在NSString類別中的文件NSString+SBJSON.m文件。由於動態運行時如何在Objective-C中工作,靜態庫中定義的類別不會被加載,除非您使用-Objc標誌進行鏈接。如果該類別沒有被加載,那麼動態綁定失敗,並且您會遇到可怕的「不響應選擇器」異常。

+0

您可能也必須使用'-all_load'標誌。 –