私はiPhoneアプリケーションからこれらの警告のいくつかを取り除こうとしています。私が最も得ているのは、void関数があり、[selfmyFunction];を使用して呼び出す場合です。警告は、関数を呼び出す行にあり、「メソッド '-myFunction'が見つかりません(戻り値の型のデフォルトは 'id'です)」と表示されます。これを修正するには何をする必要がありますか?ありがとう
次のように、ヘッダーファイルで関数を宣言します。
-(void)myFunction;
または
-(NSString*)myFunction;
-(id)myFunction;
-(NSInteger)myFunction;
-(BOOL)myFunction;
などなど。
これは、コンパイラを単にサイレンシングするよりも重要です。関数の戻り値の型がポインタではない場合(id
またはanything*
)特に、同じサイズでない場合は、非常に奇妙でバグを見つけるのが難しくなる可能性があります。
例えば。関数がCGRect
構造体を返し、コンパイラがid
を想定している場合(警告にあるように)、本当に奇妙なことが起こります。
その関数は、ヘッダーファイル(.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ファイルの「interface」セクション内に追加します。すべてのプロパティの後、@ endの前。
幸運を!
メソッドを含む.hファイルをインポートする必要があります
次にこの問題を決定します。
-ファイル:MyObjectController.h--
#import "MyObject.h"
@interface MyObjectController
{
MyObject * obj;
}
-(void) makeSomething;
@end
-ファイル: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
関数が.mファイルの呼び出し元の前に配置されていることを確認してください!!これが正しい方法であるかどうかはわかりませんが、警告はすべて削除されています。
また、Appleのサンプルコードでは、hまたはmファイル内のすべてのメソッドを宣言しているわけではありません。すぐに使えます。
-(void)myFunctionがあることを確認してください。ヘッダーファイルで宣言し、myFunctionが何も返さないようにします。
同様の問題が発生しました。これは、プロジェクト内の別のサブディレクトリに同じ名前の別のヘッダーファイルがあり、削除したと思ったためです。これは最終的に、間違ったヘッダーファイルを検索していたため、メソッドがヘッダーで宣言されていないとコンパイラに思わせていました。
使用しているオブジェクトのヘッダーファイルでもこの関数が宣言されていることを確認してください。
sky.h
:
@interface sky : object {
}
-(void) doSomething:(int)param;
@end
sky.m
:
#import "sky.h"
@implementation sky
-(void) doSomething:(int)param
{
//dosomething usefull
}