2011-03-21 20 views
2

在Objective-C,進行選擇的方法都一樣:爲什麼performSelector:withObject:方法只能使用id?

- performSelector:withObject: 
- makeObjectsPerformSelector:withObject: 
- performSelectorInBackground:withObject: 

,只能採取ID(指針)對象的參數?你知道爲什麼嗎 ?是從C繼承的東西,並使用線程我們需要一個指針?


編輯:,以及我們不能直接創建指針的Objective-C。如果我想用指針做下面的事情,這是否正常工作? (我瞭解的NSNumber和NSValue類,但我只是想了解它是如何工作)

int i = 5; 
int *pointer_i = &i; 
[self performSelector:mySelector withObject:pointer_i]; 
+0

啊!你可以說它需要一個類型爲void *的參數。但我仍然在這裏理解你的問題。 – 2011-03-21 13:48:32

+1

@Praveen S每個'id'都是一個指針,但不是每個'void *'都是'id'。 – Jilouc 2011-03-21 14:09:07

回答

2

你可以施放withObject:(id)pointer_i但這是一個壞主意
在這個特定的實例中,參數withObject:retain ed。如果您傳入int *,而該方法預計爲id,則您的程序會因爲嘗試retainint而崩潰!

+0

好的,謝謝!我剛纔看到,如果我用我的int創建一個NSNumber,並且在我的函數中我嘗試顯示它,它顯示一個奇怪的數字。 NSLog(@「我的號碼:%i」,i);打印:1073752700這是指針地址? – 2011-03-22 14:27:35

+1

您正在使用格式說明符'%i'作爲'int'。您應該切換到使用'%@'對象描述說明符或使用'[i intValue]'。 – Richard 2011-03-22 21:22:11

1

因爲ID是一個指向任何類型的對象。所以你不需要知道你得到了什麼類型的對象(NSString,NSArray)。一個id可以指向任何東西。

+0

所以,我假設我用int指針編輯工作? Xcode說「不兼容的指針類型'int *'到參數'id'」。我們知道'id'是'void *',所以我可以將我的指針放在'id'中並且它會起作用嗎? – 2011-03-21 14:55:03

+1

將任意指針(如int *)傳遞給期望對象指針的接口要求麻煩,即使它現在看起來「工作」,這是不正確的,並可能很容易在後續的操作系統版本中破壞 – 2011-03-21 15:25:37

+0

我想換個說法,「id」是指向NSObject的任何子類的指針,而不是「指向任何類型對象的指針」,你絕對不能把'id'想象成void *。你不能做什麼OP試圖做和傳遞'INT *'(當然,你可以避開它,做它,但它是不聰明的話) – filipe 2011-03-22 14:16:32

3

你只能給指針作爲參數,所以objective-c對象。如果你想使用一個整數,試試這個:

int i; 
[self performSelector:@selector(mySelector:) withObject:[NSNumber numberWithInt:i]]; 
+0

是的,我知道,(我更新了我的問題有關指針目標-C)。 – 2011-03-21 14:18:08

+0

那麼問題還有哪些呢?只需使用NSNumber而不是直接int。 int是一個原始的,並且不使用的指針,而NSNumber的是它可以包含任何類型的原始數量的對象,並且是一個指針。 – 2011-03-21 14:19:52

+0

但是在C中,我們可以有一個指向int的指針。 – 2011-03-21 14:44:19

0

基本上你可以傳入任何單個對象(如果你需要這種靈活性,它本身可以是一個數組或字典,當然你需要能夠將它傳遞給你所調用的函數)

我離開這個答案的原因就是提到一個陷阱,使用這個時候會讓我失望幾個小時,如果在選擇器名稱後面留下冒號,應用程序將會編譯,但是會在運行時崩潰時間。

要使用前面的例子

[self performSelector:@selector(mySelector:) withObject:[NSNumber numberWithInt:i]]; 

「mySelector:」需要冒號。

好的,也許這是一件小事,對硬核編碼者來說很明顯,但花了我很多時間去調試。如果你的代碼崩潰了,並且你傳遞的對象是有效的,那麼選擇器可能不是。

相關問題