对于非常简单的类
,我有非常简单的构造函数@interface MapPathPoint : NSObject {
int mX, mY;
}
- (id)initWithX:(int)x Y:(int)y;
@property int x, y;
@end
@implementation MapPathPoint
@synthesize x = mX, y = mY;
- (id)initWithX:(int)x Y:(int)y {
if(self = [super init]) {
mX = x;
mY = y;
}
return self;
}
@end
当我打电话
MapPathPoint *start = [[MapPathPoint alloc] initWithX:posX Y:posY];
我的mX和mY将包含垃圾,而不是我发送的值。我甚至试图用常数发送它
MapPathPoint *start = [[MapPathPoint alloc] initWithX:1 Y:0];
并且结果相同。当我调试它并进入init函数时,x和y的值看起来像是来自内存的随机值。我尝试过多次清理/重建,重新启动xcode以及我的Mac和iPad,但没有任何帮助。自从我上次参与该项目以来,唯一改变的是(据我所知)ipad OS更新到4.2.1(我认为是3.2)
知道可能出现什么问题吗?
编辑: 当我将参数类型更改为float时,一切都按预期工作。如果我使用int或unsigned int,我会在下面的注释中指定值。如果我尝试使用unsigned short,我得到的只是0。
答案 0 :(得分:1)
您可能需要直接使用生成的访问器而不是成员变量,尤其是在init。也许底层代码生成从3变为4。
- (id)initWithX:(int)ax Y:(int)ay {
if(self = [super init]) {
self.x = ax;
self.y = ay;
}
return self;
}
答案 1 :(得分:0)
可能是parameter- / property-names的问题。尝试重命名x / y中不同于这些参数的参数。
我认为您不小心将属性的值分配给变量。
答案 2 :(得分:0)
您的问题是您的属性正在创建x和y实例变量,所以这样做:
mX = x;
mY = y;
实际上是尝试将实例变量x和y分配给mX和mY,而不是作为init方法的参数传递的x和y。如果没有在界面中明确设置它们,ivars就不习惯由属性创建 - 它们现在就这样做了。
试试这个:
@interface MapPathPoint : NSObject {
int mX, mY;
}
- (id)initWithX:(int)x Y:(int)y;
@property int x, y;
@end
@implementation MapPathPoint
@synthesize x = mX, y = mY;
- (id)initWithX:(int)xx Y:(int)yy {
if(self = [super init]) {
mX = xx;
mY = yy;
}
return self;
}
@end
答案 3 :(得分:0)
我发现了问题,但我仍然不确切知道发生了什么。 我有完全不同的类,它使用具有相同名称的init函数,只接受浮点值。它有点混合了。当我删除这个float类或重命名它的init函数时,一切正常。
这是我做的小测试案例
@interface FloatClass : NSObject {
}
- (id)initWithX:(float)x Y:(float)y;
@end
@interface IntClass : NSObject {
}
- (id)initWithX:(int)x Y:(int)y;
@end
@implementation IntClass
- (id)initWithX:(int)x Y:(int)y {
if(self = [super init]) {
NSLog(@"IntClass: %i %i", x, y);
}
return self;
}
@end
@implementation FloatClass
- (id)initWithX:(float)x Y:(float)y {
if(self = [super init]) {
NSLog(@"FloatClass: %f %f", x, y);
}
return self;
}
当我使用那些课程时
[[IntClass alloc] initWithX:1 Y:2];
[[FloatClass alloc] initWithX:1 Y:2];
结果是
IntClass: 1065353216 1073741824
FloatClass: 1.000000 2.000000
我应该报告这个错误或我不知道的功能吗?当然看起来像虫子,但我在生活中看到了陌生的特征:)