2011-06-18 49 views
0

所以我試圖在數組中存儲一系列的方法(如果有意義的話)。Objective-C中的函數指針問題

void *pointer[3]; 
pointer[0] = &[self rotate]; 
pointer[1] = &[self move]; 
pointer[2] = &[self attack]; 
//... 

我想要做的是有一個東西的數組,並基於數組中的對象的類型,調用某個方法。而不是有一羣如果聲明說,類似的:

if ([[myArray objectAtIndex:0] type] == robot]) { 
    //Do what robots do... 
} 
else if (...) { 
} 
else { 
} 

,並在計時器有此我希望使它像這樣:

pointer[[[myArray objectAtIndex:0] type]]; //This should invoke the appropriate method stored in the pointer. 

現在上面的代碼表示(第一個代碼塊):

左值需要作爲一元'&'操作數。

如果您需要任何澄清只是問。

此外,爲了讓您知道我所調用的所有方法都是void類型,並且沒有任何參數。

回答

3

如果您需要傳遞對C函數的引用,但是在使用Objective-C對象上的方法時,應該使用函數指針selectorsSEL類型。然後

您的代碼將是這樣的:

SEL selectors[3]; 
selectors[0] = @selector(rotate); 
selectors[1] = @selector(move); 
selectors[2] = @selector(attack); 

... 

[self performSelector:selectors[n]]; 
+0

我已經跑了你的代碼。它應該是選擇器[3]而不是選擇器[3],但是謝謝! – Dair

+0

哎呀,很好。這就是我沒有測試過的複製過去編輯。固定。 – Jonah

5

您不能僅使用&運算符將函數指針從Objective-C函數中提取出來。

你會想看看:

任何這些都可以做你想做的。如果你不熟悉這個選擇器(@selector編譯器指令和SEL類型),肯定會閱讀(這是一個基本概念,你需要很多)。塊是相當新的(從Mac OS X 10.6和iOS 4開始可用),它們將爲您節省大量工作,因爲您需要在早期版本的Mac OS X和iOS上使用目標/選擇器,NSInvocation或回調函數。