Ошибка памяти EXC_BAD_ACCESS при доступе к переменным экземпляра - PullRequest
0 голосов
/ 09 декабря 2011

У меня проблемы с переносом Java-проекта, над которым я работал некоторое время назад, в код Objective-C - в первой строке этого кода я получаю «Сигнал программы получен:« EXC_BAD_ACCESS »»:

вызывается здесь:

-(id) initWithStart:(Point3D *)start andDirection:(Point3D *)dir {

  if ( self = [super init] ) {

    NSLog(@"%@%@", @"Direction:", [dir toString]);

    printf("Trying to find unit length of direction...\n");
    NSLog(@"%@", [[dir unit] toString]);


    self.start = start;
    self.direction = [dir unit];
  }

  return self;
}

Вывод на консоль:

2011-12-09 17:20:14.021 RayTracerProject[16607:407] Direction:(0,0,20)
Trying to find unit length of direction...

Метод toString Point3D выглядит следующим образом:

-(NSString *) toString {
  NSNumber *xstring = [NSNumber numberWithDouble:self.x];
  NSNumber *ystring = [NSNumber numberWithDouble:self.y];
  NSNumber *zstring = [NSNumber numberWithDouble:self.z];

  NSString * str = @"(";
  str = [str stringByAppendingString:[xstring stringValue]];
  str = [str stringByAppendingString:@","];
  str = [str stringByAppendingString:[ystring stringValue]];
  str = [str stringByAppendingString:@","];
  str = [str stringByAppendingString:[zstring stringValue]];
  str = [str stringByAppendingString:@")"];

  return str;
}

из того, что я вижу, мой (Point3D *) dir жив и здоров, когда я проверяю, какое значение использует мой вызов [dir toString].Но когда я пытаюсь вызвать [dir unit], кажется, что у меня больше нет переменных, которые я сделал в объекте, следовательно, ошибка EXC_BAD_ACCESS.

Что я здесь не так делаю?Я думаю, что это связано с тем, как я управляю (или нет) использованием моей памяти, но я не знаю, что это такое.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

NSLog в вашем методе 'unit' должен быть:

NSLog(@"%@ %g", @"X:", x);

Перемещение пробела не является обязательным, но только делает его более понятным. Ключевыми проблемами было то, что вы пропустили @ до "X: ", и вам нужно использовать %g вместо %@, потому что из вашего другого кода x является двойным, а не NSObject. Эквивалент - но проще и, следовательно, лучше - также будет:

NSLog(@"X: %g", x);

В документации Apple содержится полное руководство по спецификаторам формата строки , а также в документации к ней объясняется использование таких спецификаторов формата, как %@ (для ссылки на объект Objective C) и %g (для ссылки 64-битное число с плавающей точкой) при построении строки NSString.

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

Кажется, что эта строка здесь:

NSLog(@"%@%@", "X: ", x);

должна выглядеть примерно так:

NSLog(@"%@%lf", @"X: ", self.x);

Обратите внимание на некоторые изменения здесь:

  • Из вашего другого кода, похоже, у вас есть свойство с именем 'x'.self.x ссылается на это свойство.(Вы также можете иметь или не иметь переменную экземпляра с именем 'x')
  • Также из вашего другого кода кажется, что ваше свойство 'x' является двойным.Таким образом, заполнитель для двойника - %lf, а не %@.%@ для NSObjects (и потомков)
  • Литералы NSString начинаются с @.Так что @"X: " является литералом NSString.То, что у вас было, - это строка C.

EDIT

Ну, я медленный, как обычно.:) Не обращайте внимания на то, что я сказал, и примите ответ Дункана, который на самом деле был быстрее и чище.

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