Objective-C: изменение значения int без причины

Цель-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 переменная.

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

Я сделал Apple + Shift + F для maxSprites" In 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и не делает эту линию.

РЕДАКТИРОВАТЬ: вот функция, я прокомментировал все внутри, и это все еще происходит:.h

    -(void)checkMatchBarAward:(int)spriteTypeToAdd;

.m

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

РЕДАКТИРОВАТЬ:

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

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

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

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

  int matchBarArray[8];

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

  matchBarArray[spritesCaptured-1] = spriteTypeToAdd;

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

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

Я не могу поверить, что попадание памяти вне массива в Objective-C может вызвать такой бунт =) И ЭТО ТАК ТРУДНО, ЧТОБЫ ОТЛАДАТЬСЯ!

3 ответа

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

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

  int matchBarArray[8];

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

  matchBarArray[spritesCaptured-1] = spriteTypeToAdd;

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

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

Я не могу поверить, что попадание памяти вне массива в Objective-C может вызвать такой бунт =) И ЭТО ТАК ТРУДНО, ЧТОБЫ ОТЛАДАТЬСЯ!

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

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

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

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

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

Другие вопросы по тегам