传递给函数时参数值会更改

时间:2010-12-08 21:25:55

标签: iphone objective-c cocoa-touch ipad

几天后我回到了我的一个ipad项目,最奇怪的事情开始发生了。当我离开时,应用程序工作正常。

对于非常简单的类

,我有非常简单的构造函数
@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。

4 个答案:

答案 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

我应该报告这个错误或我不知道的功能吗?当然看起来像虫子,但我在生活中看到了陌生的特征:)