不兼容的指针类型将“NSString *”发送到“NSInteger *”类型的参数(又名“int *”)

Posted

技术标签:

【中文标题】不兼容的指针类型将“NSString *”发送到“NSInteger *”类型的参数(又名“int *”)【英文标题】:Incompatible pointer types sending 'NSString *' to parameter of type 'NSInteger *' (aka 'int *') 【发布时间】:2012-05-15 22:48:59 【问题描述】:

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

*不兼容的指针类型将“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];

哪里错了? 谢谢 坦率的

【问题讨论】:

从你发布的代码来看,我不得不建议你买一本关于 Objective-C 的书。你的代码很少有意义,我认为投资于学习基础知识将是非常值得的。有太多的事情需要单独指出来修复您的代码,但我会说慢慢来并确保您理解该语言的所有概念是一个好主意。 【参考方案1】:

首先 NSInteger 是整数类型,不是对象,所以不需要指针。

其次,您的方法声明格式不正确。应该是这样的:

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

【讨论】:

malformed 是个不错的说法,看着就头疼。 我会回答的,但我仍在努力弄清楚他是如何编写方法的 :) 拥有未命名标签的方法实际上是合法的语法。 : 是一个有效的方法名 合法的,是的。尝试通过同行评审获得它:) 合法的,是的......而且肯定会引起任何有经验的 ObjC 开发人员的愤怒。【参考方案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 不同,NSNumber 是一个封装了 NSInteger 之类的

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


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

【讨论】:

... 而旧的 Object 也定义了一个 -free 方法。我们不再谈论那么多了。 :) 可怜的Object...没有人喜欢它了。能够尝试它是件好事,但现在当然 Cocoa 和 Objective-C 的耦合越来越紧密了。 鉴于 Object 是多么简单,如果你真的想去那里,实现你自己的基类!关键是从不将您的基类(或 Object 子类)与 NSObject 派生类混合。几乎没有假设手动保留释放运行时行为(我认为您需要实现 +initialize 并且可能还需要方法转发)。

以上是关于不兼容的指针类型将“NSString *”发送到“NSInteger *”类型的参数(又名“int *”)的主要内容,如果未能解决你的问题,请参考以下文章

指向整数转换的不兼容指针将“void *”发送到“PHImageContentMode”类型的参数(又名“枚举 PHImageContentMode”)

不兼容的整数到指针的转换将“NSInteger”(又名“int”)发送到“NSInteger *”(又名“int *”)类型的参数

不兼容的块指针类型将“int (^)(__strong id, __strong id)”发送到“NSComparator”类型的参数

从'NSInteger'(又名'int')分配给'NSString *'的不兼容整数到指针转换;

Xcode 7 - 不兼容的块指针类型

将 'NSString *' 转换为 'CTStringRef *' 的不兼容类型