Значения параметров изменяются при передаче в функцию - PullRequest
0 голосов
/ 09 декабря 2010

Я вернулся к одному из своих проектов 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 до 4.2.1 (я думаю, с 3.2)

Есть идеи, что может быть не так?

РЕДАКТИРОВАТЬ: Когда я изменяю тип параметров на float, все работает как положено.Если я использую int или unsigned int, я получаю значения, указанные в моем комментарии ниже.Если я пытаюсь использовать unsigned short, я получаю только 0.

Ответы [ 4 ]

1 голос
/ 09 декабря 2010

Возможно, вам нужно использовать сгенерированные средства доступа, а не переменные-члены, особенно при инициализации. Возможно, основная генерация кода изменилась с 3 на 4.

- (id)initWithX:(int)ax Y:(int)ay {
  if(self = [super init]) {
    self.x = ax;
    self.y = ay;
  }
  return self;
}
0 голосов
/ 09 декабря 2010

Я нашел проблему, но я до сих пор точно не знаю, что происходит. У меня был совершенно другой класс, который использовал функцию инициализации с тем же именем, только она принимала значения с плавающей точкой. И это как-то смешалось. Когда я удаляю этот класс с плавающей точкой или переименовываю его функцию инициализации, все в порядке.

Вот небольшой тестовый пример, который я сделал

@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

Это ошибка, о которой я должен сообщить или функция, о которой я не знал? Конечно, выглядит как ошибка, но я видел странные черты в моей жизни:)

0 голосов
/ 09 декабря 2010

Ваша проблема в том, что ваши свойства создают переменные экземпляра x и y, так что:

mX = x;
mY = y;

на самом деле пытается присвоить переменным экземпляра x и y значениям mX и mY, а не значениям x и y, переданным в качестве параметров метода init. 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
0 голосов
/ 09 декабря 2010

Может быть проблема с именами параметров / свойств.Попробуйте переименовать параметры из х / у чем-то отличным от этих.

Я думаю, что вы случайно присваиваете значения свойств вашим переменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...