Objective-C: изменение значения int без причины - PullRequest
3 голосов
/ 21 декабря 2009

Цель-C: мне нужна помощь в сохранении значения int. Это меняется на меня без моей команды.

Первоначальный вопрос был: «Как вы объявляете и сохраняете int?», Который был удовлетворен в другом посте здесь: Objective-C: Как вы объявляете и сохраняете int?

Теперь у меня проблема, когда int, которому было 18, меняется на 2, как-то сам по себе.

Вот мой код:

@interface Game : Layer // this is from cocos2d
{
   int maxSprites;
}

@implementation Game
-(void)initVariables
{
  maxSprites = 18;
}

Позже, когда я распечатал, как

 NSLog(@" maxSprites = %d  ", maxSprites);

Я получаю:

 maxSprites = 2

И операции, которые требуют, чтобы это было 18, зависали или не работали, как будто это действительно просто 2.

Как это возможно? =)

Apple + Shift + F не показывает никакого другого использования переменной maxSprites.

Я смотрел на другие примеры кода, и часто они выставляют переменную с помощью getter и setter, и они также используют @property. Я что-то пропустил? Я новичок в Objective-C, так что я мог бы просто быть!

Я сделал Apple + Shift + F для maxSprites "В Project, Textual, Contains, Ignore Case и привел только к:

       Game.h:  int maxSprites;
       Game.m:  maxSprites = 18;
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);

Я нашел место, где оно меняется, используя точку наблюдения. Меняется

    Expression: “*(int *) 67379960”
    New Value: 2
    Old  Value: 18

в этой строке:

   [self checkMatchBarAward:spriteTypeToAdd];

Странно? Эта функция ничего не делает с maxSprites, как и эта строка.

EDIT: вот функция, я прокомментировал все внутри, и это все еще происходит: .h

    -(void)checkMatchBarAward:(int)spriteTypeToAdd;

     -(void)checkMatchBarAward:(int)spriteTypeToAdd
      {
      }

EDIT:

Спасибо за рекомендации. Я очистил все цели, и он все еще изменил значения. Из-за ответов, которые вы дали мне, ребята, вы привели меня к проблеме. Спасибо за вашу помощь.

Я опубликовал результаты ниже в ответе. Вот копия:

Ребята, вы не поверите, в чем причина. Спасибо за вашу помощь, потому что велели мне вычистить, посмотреть и проверить мои типы, это помогло.

Я просмотрел свои массивы. Я нашел тот, который был объявлен так:

  int matchBarArray[8];

2 строки вверх от точки останова, где говорится, что значение изменилось с 18 на 2, у меня есть эта строка:

  matchBarArray[spritesCaptured-1] = spriteTypeToAdd;

И угадайте, что я перешел границы массива на 1. Если я увеличу размер массива до 9, я больше не получу изменение int с 18 до 2.

Кроме того, если я превышаю границы более чем на 1, то есть я уменьшаю размер массива до меньшего, есть другие вещи, которые начинают меняться, такие как мой счет, логические значения, вся игра! =)

Я не могу поверить, что попадание памяти за пределы массива в Objective-C может вызвать такой бунт =) И так трудно отладить!

Ответы [ 3 ]

3 голосов
/ 21 декабря 2009

Ребята, вы не поверите, в чем причина. Спасибо за вашу помощь, потому что велели мне вычистить, осмотреть и проверить мои типы, это помогло.

Я просмотрел свои массивы. Я нашел тот, который был объявлен так:

  int matchBarArray[8];

2 строки от остановки точки останова, где говорится, что значение изменилось с 18 на 2, у меня есть эта строка:

  matchBarArray[spritesCaptured-1] = spriteTypeToAdd;

И угадайте, что я перешагнул границы массива на 1. Если я увеличу размер массива до 9, я больше не получу изменение int с 18 до 2.

Кроме того, если я переступаю границы более чем на 1, то есть я уменьшаю размер массива до меньшего, появляются другие вещи, которые начинают меняться, такие как мой счет, логические значения, вся игра! =)

Я не могу поверить, что попадание памяти за пределы массива в Objective-C может вызвать такой бунт =) И так трудно отладить!

2 голосов
/ 21 декабря 2009

Если ваш метод checkMatchBarAward: действительно пуст, вам нужно очистить проект ( Shift + cmd + k ) и перестроить его.

0 голосов
/ 21 декабря 2009

Я не увидел строку, указанную в вашем коде.

Вероятно, однако, что вы называете что-то длинным *, когда это int * или что-то в этом роде (хотя, как после всех этих лет C STILL не может видеть, что это за мной).

В любом случае, проверьте ваши типы, где размеры того, на что они указывают, могут отличаться. Если вы ссылаетесь на ячейку памяти int * с помощью long * (скажем, передавая int * методу, который ожидает long *), вы очистите стек и начнете изменять смежные переменные.

Я делал это не раз, но в C, а не в Objective C - так что я не уверен, что это правильный ответ.

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