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- так что я не уверен, что это правильный ответ.