2012-10-09 47 views
1

我有以下問題,解決不了,也許有人知道一招:)iOS的 - 在performselector

主要對象必須是動態的,因爲它可能是不同的通過參考...

功能應該被稱爲:

+ (NSArray *)parseJSONString:(NSString *)theJSONString error:(NSError **)errorPointer 

由於代碼已經聲明瞭,我想分析JSON。我有一個正在實現這個功能的幾個對象,這就是爲什麼我使用performSelector方法:

if ([[self.theObject class] respondsToSelector:@selector(parseJSONString:error:)]) { 
    NSError *parsingError = nil; 
    self.myObjectsCollection = [[self.theObject class] performSelector:@selector(parseJSONString:) 
                  withObject:utf8ResponseString 
                  withObject:parsingError];   
} 

utf8ResponseString包含JSON ...

我已經試過如下:

... withObject:&parsingError -> compile error 
... withObject:[NSValue valueWithPointer:&parsingError] -> works until the value will be redirect to the parsingError -> Bad Exec 

我已搜索了一天,甚至沒有如何解決這個問題 - 請幫助...

感謝和問候, mathew

+0

我會用協議和委託 –

回答

2

performSelector:...方法家族僅採用對象參數。你想傳遞一個指針指向一個指針,這與一個對象是不一樣的,所以類型系統不允許它。幸運的是,你根本不需要performSelector:。你可以做[[self.theObject class] parseJSONString:utf8ResponseString error:&parsingError]

只有在運行時才能知道要發送的消息時,才需要使用performSelector:。如果你沒有傳入變量作爲第一個參數,你可能不需要它。但是,如果你確實需要這樣做,你需要做的是編寫一個「包裝器」方法,它接受一個對象(比如說一個NSValue)並用非對象類型調用真正的方法,你可以用你的performSelector:withObject:來調用包裝,而不是真正的方法。

+0

完美的感謝! – user617965

1

爲什麼不直接調用類的方法呢?您已經檢查過它可以響應該方法。所以直接調用該方法。

[[self.theObject class] parseJSONString: nil error: &error]. 

順便說一句,你可以做一個簡單的狀態模式交換。即使對象響應者是在運行時定義的,消息調用也不是。如果編譯器發出警告,則轉換爲id。因爲我不確定你可以在類方法上分配協議。 (但也許你可以)。

甚至可以將所有對象分析器嵌入到代理分析器類中,以便在編譯時定義它。

可以肯定的是,您可以傳遞一個指針指向指針對象(** erorr)執行選擇器::(因爲運行時不是占卜者)。如果你真的需要,做一個簡單的c函數callBack?

+0

也謝謝你! – user617965

4

要添加到其他答案的完整性,如果你真的需要動態調用一個名字只在運行時已知的方法(事實證明你不需要在這種情況下,但如果你這樣做)與非-object參數,然後適當的解決辦法是:

  • 使用一個NSInvocation的,或
  • 通話objc_msgSend...運行功能之一直接
+0

和你也一樣!試過那個也是... – user617965