关于iphone:向“ NSInteger *”类型的参数发送“ NSString *”的不兼容指针类型(又名“ int *”)

 2019-10-16 

Incompatible pointer types sending 'NSString *' to parameter of type 'NSInteger *' (aka 'int *')

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

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

在data.h中

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

在data.m

1
2
3
4
5
6
7
8
9
- (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 { .......
......
}

以及我在哪里调用我的方法

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

哪里错了?
谢谢
坦率


首先,NSInteger是整数类型,而不是对象,因此不需要指针。

其次,您的方法声明格式错误。应该是这样的:

1
2
- (id)initCityWithPath:(NSString *)pathDB andId:(NSInteger)id_city andType:(NSString *)type;
- (void)getCityWithPath:(NSString *)dbPath andId:(NSInteger)id_city;


1
 - (id)initCity:(NSString *)pathDB: (NSInteger *)id_city: (NSString *)type;

此方法的名称为initCity:::,它带有三个参数pathDBid_citytype。这可能不是您想要的,也可能不是任何必须查看您的代码的人想要的。使用Objective-C可以命名方法的参数,任何不命名其参数的方法将始终是可疑的1。对于大多数Objective-C开发人员而言,initCity:::并不是方法的好名字。

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

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

这里没有冒犯的意图,但是从您上面提供的代码看来,您似乎对Objective-C的基本方面缺乏了解。我建议阅读一本好书,跟随一些著名的教程,并在继续之前先看一下苹果的一些示例代码。

1:对于较早的运行时,在objc/Object.h中声明的根Object类具有称为forward::performv::的两个方法,它们都包含一个未命名的参数,这些方法用于消息转发。