2014-07-01 39 views
0

我需要在NSMutableArray添加函數指針的NSMutableArray

陣列添加一些功能:

[_array addObject:@selector(myFunction:)]; 

功能:

- (void) myFunction:(NSString*)someParam {} 

錯誤:

Incompatible pointer types sending 'SEL' to parameter 'id' 

我該怎麼做? :/

目的是調用數組函數隨機

問候

+0

「@ selector」不是可可「對象」。 –

+0

那麼,我怎樣才能添加一個函數指針到一個NSMutableArray? – StrawHara

+0

創建一個包含選擇器的對象。你可能可以使用NSValue,但我懷疑'@ selector'不是一個簡單的指針值。 –

回答

3

只能在NSArray中存儲的對象。但SEL不是那些(它被定義爲指向<objc/objc.h>中的結構的指針)。

,以獲得存儲在數組中你選擇,你必須收拾它在NSValue對象,像這樣:

[_array addObject:[NSValue valueWithPointer:@selector(myFunction:)]]; 

後來,當你真正想用你的選擇,你」我需要解壓它,如下所示:

SEL mySelector = [_array[0] pointerValue]; 

[target performSelector:mySelector]; 
+0

調用'NSStringFromSelector'並只存儲字符串不是更容易嗎? – jlehr

+0

它會工作,但不會更容易(你仍然必須轉換爲字符串和從字符串轉換)。我更傾向於使用'NSValue'解決方案,雖然它看起來更像我們保持相同的類型,只是將它裝箱。 – tomahh

+0

@jlehr:將一個指針放入一個NSvalue並將其取出是O(1)。而從字符串獲取選擇器是O(n)。 – newacct

1

另一種方法是使用塊。對於函數

-(void)myFunction{ 
} 

通過執行類似

void (^CallingBlock)()=^(){ 
    [self myFunction]; 
}; 

創建塊然後添加到一個數組爲正常

NSMutableArray *array=[[NSMutableArray alloc] init]; 
[array addObject:CallingBlock]; 

然後執行塊

[[NSOperationQueue mainQueue] addOperationWithBlock:[array objectAtIndex:0]]; 
1

你不能添加一個選擇r作爲SEL不是對象類型的數組。

如果您需要存儲方法和參數,您可以創建一個NSInvocation對象並將其存儲在您的數組中。

+0

或'NSMethodSignature'如果參數不是必需的。 –

+0

@JoshCaswell:但它不會有方法的名稱 – newacct