2011-03-13 81 views
14

我想擺脫我的iPhone應用程序中的一些警告。我得到最多的是當我有一個void函數,我用[self myFunction];來調用它。警告是在我稱之爲函數的行上,它說:「方法'-myFunction'找不到(返回類型默認爲'id')。」我需要做些什麼來解決這個問題?由於我該如何解決此警告:「找不到方法(返回類型默認爲'id')」

+0

我建議編輯你的問題,以包括有問題的代碼片段。 – payne 2011-03-13 23:11:48

+0

你可以請你發佈你的方法聲明(.h)和調用代碼嗎? – 2011-03-13 23:12:11

+4

+1爲了解決警告,這是非常好的做法!當你在它的時候,在項目設置中有幾個複選框,你可以讓編譯器警告更多的事情。 – mvds 2011-03-13 23:17:29

回答

18

聲明函數的頭文件,像這樣:

-(void)myFunction; 

-(NSString*)myFunction; 
-(id)myFunction; 
-(NSInteger)myFunction; 
-(BOOL)myFunction; 

等等等等

這是不僅僅是沉默的編譯器的更多重視:如果函數的返回類型不是指針(idanything*),特別是當它不具有相同的大小時,可能會變得非常奇怪並且很難o發現錯誤。

E.g.如果函數返回一個CGRect結構,並且編譯器假定爲id(如警告所述),那麼真正奇怪的事情將會發生。

+0

好的,謝謝。另外,如果我沒有返回任何東西,它只是一個函數,我是否使用void? – Preston 2011-03-13 23:21:23

+0

是的,沒錯! – mvds 2011-03-13 23:21:56

+1

嚴格地說,如果你沒有返回任何東西,則不需要(void);但國際海事組織,你應該永遠寫它,讓你的代碼將被其他閱讀更直接理解。 – Dave 2011-03-13 23:24:59

1

確保您有 - (void)myFunction;在你的頭文件中聲明,並確保myFunction不返回任何東西。

6

您需要在頭文件(.h)(如果它應該對其他類可見)或在實現文件(.m)中定義該函數(如果它對您的類是私有的)。

例如,如果你使用的方法:

-(void)myFunction { 
    // do something 
} 

對於「私人」功能,在您.m文件的頂部添加此;之前@implementation MyCoolClass一行。

@interface MyCoolClass() // <--- no 'category name' hides methods just for this file 
-(void)myFunction;  // <--- add the method here 
-(void)myOtherFunction; 
-(void)doSomeCoolThingWithThisString:(NSString *)firstName; 
@end 

或者如果你想調用其他文件的方法,它加入你的.h文件中,在「接口」部分內;畢竟你的屬性,並在@end之前。

祝你好運!

+0

這是一個好的做法嗎? – JonWells 2012-02-15 16:49:40

+0

當然。如果他們不是該對象與其他人的合同的一部分,通過「私人」類別「隱藏」方法是很常見的。如果您看到該方法未找到警告;通常這是兩個問題之一:1)該對象不存在該方法; 2)你沒有包含頭文件。爲了澄清,我並不是建議你爲沒有寫的方法添加聲明。 – Dave 2012-02-17 16:24:54

3

您需要導入包含你的方法

1

只需確保功能在您.m文件的調用者之前放在.h文件! 我不認爲這是做事的正確方法,但它確實消除了所有對我的警告。

而在蘋果的示例代碼中,我沒有看到他們聲明h或m文件中的所有方法。可以直接使用它。

0

確保您使用的對象在其頭文件中聲明瞭此函數。

sky.h

@interface sky : object { 

} 

-(void) doSomething:(int)param; 

@end 

sky.m

#import "sky.h" 
@implementation sky 

-(void) doSomething:(int)param 

{ 

    //dosomething usefull 
} 
1

我有一個類似的問題彈出對我來說,這是因爲我曾與另一個同名的頭文件在不同的子目錄在我認爲我已經刪除的項目中。這最終導致編譯器認爲該方法沒有在頭中聲明,因爲它在錯誤的頭文件中查找。

2

我決定接下來這個問題:

--file:MyObjectController.h--

#import "MyObject.h" 

@interface MyObjectController 
{ 
    MyObject * obj; 
} 
-(void) makeSomething; 

@end 

--file:MyObjectController.mm--

#import "MyObjectController.h" 

@implementation MyObjectController 

-(void) makeSomething {} 

@end 

---文件MyObject.h ----

@class MyObjectController; 

@interface MyObject 
{ 
    MyObjectController * objController; 
} 
-(void) callMakeSomethingFromObjController; 

@end 

---文件MyObject.mm ----

#import "MyObject.h" 
#import "MyObjectController.h" //Add this line!!! And compiller will found makeSomething  

@implementation MyObject 

-(void) callMakeSomethingFromObjController 
{ 
    [objController makeSomething];//warning was here:instance method '-makeSomething' not found (return type defaults to 'id') 
} 

@end 
相關問題