1

接続dbとメソッドdbを持つ2つのファイルdata.hとdata.mがあります。メソッドを実装すると、警告が表示されます

* 'NSString *' を 'NSInteger *' (別名 'int ') 型のパラメーターに送信する互換性のないポインター型 これは私のコードです。

data.h で

 - (id)initCity:(NSString *)pathDB: (NSInteger *)id_city: (NSString *)type;
 - (void)getCity:(NSString *)dbPath:(NSInteger *)id_city;

data.m で

- (id)initCity:(NSString *)pathDB: (NSInteger *)id_city: (NSString *)type
 {
  [self getCity:pathDB: id_city: type];
  return self;
 }

- (void)getCity:(NSString *)dbPath : (NSInteger *)id_city : (NSString *)type { .......
......
}

メソッドを呼び出す場所

NSString *mystring = @"string";
dataCity = [[Data alloc] initCity: defaultDBPath: selectedItem :mystring];
NSMutableDictionary *dictionary = [dataCity objectAtIndex:0];

どこが悪い?ありがとうフランク

4

2 に答える 2

3

まず、NSInteger はオブジェクトではなく整数型なので、ポインターは必要ありません。

次に、メソッド宣言の形式が正しくありません。次のようになります。

- (id)initCityWithPath:(NSString *)pathDB andId:(NSInteger)id_city andType:(NSString *)type;
- (void)getCityWithPath:(NSString *)dbPath andId:(NSInteger)id_city;
于 2012-05-15T22:56:26.057 に答える
2
 - (id)initCity:(NSString *)pathDB: (NSInteger *)id_city: (NSString *)type;

このメソッドの名前は、とのinitCity:::3 つのパラメーターを受け取るです。これはおそらくあなたが望むものではなく、おそらくあなたのコードを見なければならない人が望むものではないでしょう. Objective-C では、メソッドのパラメーターに名前を付けることができます。パラメーターに名前を付けていないメソッドは、常に疑わしいものになります1。ほとんどの Objective-C 開発者にとって、 はメソッドの適切な名前ではありません。pathDBid_citytypeinitCity:::

第 2 に、イニシャライザ メソッドは常に呼び出し[super init]て結果を に代入することから開始する必要がありselfます。これを行わない理由はめったにありません (たとえば、独自のルート クラスを作成する場合)。

3 番目に、 2 つの入力パラメーターと、場合によっては 1 つの in/out または出力パラメーターを返したり受け取ったりするイニシャライザー呼び出しgetCity:::(別の不適切な名前) が、オブジェクトを適切に初期化するようには見えません。出力パラメーター (例: ) がない限りvoid、メソッドが で始まることはめったにありません。あなたの場合、間違ったタイプを使用している可能性があると思います.32ビットプラットフォームでは32ビット整数、64ビットプラットフォームでは64ビット整数のエイリアスです。したがって、そのような整数へのポインターです。紛らわしいですが、これは のようなものをカプセル化するクラスとは異なります。getgetBytes:length:NSIntegerNSInteger *NSNumberNSInteger

ここで攻撃するつもりはありませんが、上記のコードから、Objective-C の基本的な側面を理解していないようです。先に進む前に、良い本を読んだり、評判の良いチュートリアルに従って、Apple のサンプル コードをいくつか見たりすることをお勧めします。


1: 古いランタイムの場合、 でObject宣言されたルート クラスにobjc/Object.hは 2 つのメソッドが呼び出されforward::performv::どちらにも名前のないパラメーターが含まれており、これらはメッセージ転送に使用されていました。

于 2012-05-15T23:25:18.463 に答える