1

我有 2 个文件,data.h 和 data.m,带有连接 db 和方法 db。当我实现一个方法时,我有一个警告

*不兼容的指针类型将'NSString *'发送到'NSInteger *'(又名'int ')类型的参数这是我的代码。

在数据.h

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

在数据.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:::接受三个参数pathDBid_citytype。这可能不是您想要的,也可能不是任何必须查看您的代码的人想要的。Objective-C 使您能够命名方法的参数,任何不命名其参数的方法将始终是可疑的1。对于大多数 Objective-C 开发人员来说,initCity:::这并不是一个好名字的方法。

其次,初始化方法应始终从调用[super init]并将结果分配给self. 很少有理由不这样做(例如,当您创建自己的根类时)。

第三,您的初始化程序调用getCity:::(另一个糟糕的名称),它返回void并接受两个输入参数,可能还有一个输入/输出或输出参数,这看起来不会正确初始化您的对象。get除非它具有输出参数(例如getBytes:length:) ,否则很少看到方法以开头。在您的情况下,我认为您可能使用了错误的类型,NSInteger是 32 位平台上的 32 位整数和 64 位平台上的 64 位整数的别名。NSInteger *因此是一个指向这样一个整数的指针。NSNumber这很令人困惑,但这与封装诸如NSInteger.

这里无意冒犯,但从您上面提供的代码看来,您似乎对 Objective-C 的基本方面缺乏一些了解。我建议阅读一本好书,遵循一些著名的教程,并在继续之前查看一些 Apple 的示例代码。


1:对于较旧的运行时,在中声明的根Objectobjc/Object.h有两个方法被调用forward::performv::并且都包含一个未命名的参数,这些都用于消息转发。

于 2012-05-15T23:25:18.463 回答