2011-03-22 74 views
2

我寫了一個函數,看起來像這樣:傳遞參數時將整數指針不進行強制轉換

- (void)changeText:(NSUInteger)arrayIndex; 

我們只能說這是在類標籤的方法。比方說,我有一個Label對象的數組。我把這樣的功能:

[[labels objectAtIndex:0] changeText:1]; 

或像這樣:

NSUInteger index = 1; 
[[labels objectAtIndex:0] changeText:index]; 

爲什麼它給我的警告:Passing argument 1 of 'changeText:' makes pointer from integer without a cast?代碼執行得很好。

* 編輯 *

調用函數這些方式並沒有給出一個警告:

[[labels objectAtIndex:0] changeText:0]; //arrayIndex is 0 

Label *object = [labels objectAtIndex:0]; 
[object changeText:1]; 
+1

代碼看起來很好,我在這裏沒有得到這樣的警告。這是給你警告的確切代碼嗎? – 2011-03-22 03:54:02

+0

是啊,喬希是正確的,即使我嘗試了代碼,並沒有給我一個警告。請輸入您使用的確切代碼,因爲這不會給出任何警告。 – 2011-03-22 05:11:51

+0

我懷疑是對的。 objectAtIndex:返回一個NSObject,並且編譯器無法確定應用哪個changeText:消息。顯然還有一些其他changeText:在他的系統中可能需要一個NSString *。在編譯器知道要構建哪個消息之前,必須將NSObject轉換爲Label *。以我的答案爲例。 – Vagrant 2011-03-22 06:04:40

回答

2

不知何故,它認爲changeText:將指針作爲參數。可能是因爲objectAtIndex:返回一個NSObject和Objective-C不知道,先驗,什麼類的簽名適用於它。

爲什麼不把objectAtIndex的結果賦值給Label *,然後 apply changeText:對嗎?

像這樣: Label * label =(Label *)[labels objectAtIndex:0]; [label changeText:1];

+0

這是一個很好的想法,但'[[labels objectAtIndex:0] changeText:1];'仍然不給我一個警告,即使有第三個對象填充數組,所以擁有該數組的這個類既不導入Label.h也沒有'@class Label'聲明。我不認爲我們從OP得到完整的故事。 – 2011-03-22 05:45:47

+0

你有與他不同的構建系統。也許他正在使用一個帶有chageText:的消息,它帶有一個NSString *。 – Vagrant 2011-03-22 06:05:55

+0

我無法在任何搜索中找到「changeText:」,但您可能是對的。 Re:你的例子,演員是不必要的。 'objectAtIndex:'返回'id',而不是'NSObject *'。 – 2011-03-22 06:31:03

5

多不容易,你是不是#import荷蘭國際集團包含定義頭文件changeText:.m文件正在調用它,因此,編譯器沒有看到方法聲明,並不知道論證應該是什麼。

或者你有一個changeText:定義的方法確實將對象引用作爲參數,編譯器在編譯調用站點之前看到它。

+0

這些都不是問題。有趣的是,以這種方式調用方法不會給出錯誤:[[labels objectAtIndex:0] changeText:0] – Justin 2011-03-22 04:27:14

+0

對,因爲0是一個有效的指針,就C而言。 – Vagrant 2011-03-22 05:09:50

+1

或者他沒有在頭文件中聲明'changeText:'方法。 – Chuck 2011-03-22 05:30:43

相關問題