不兼容的指针类型将“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:::
,它接受三个参数,pathDB
、id_city
和type
。这可能不是您想要的,也可能不是任何必须查看您的代码的人想要的。 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”类型的参数