Значение Int становится больше при отправке в метод

#objective-c #cocos2d-iphone

#objective-c #cocos2d-iphone

Вопрос:

РЕШЕНИЕ:

Простое разделение вызова метода Tile *tile = [[Tile alloc] initWithX:x Y:y]; на две отдельные строки, такие как: Tile * tile = [Tile alloc]; [tile initWithX:x Y:y]; привело к тому, что метод перестал получать целые числа в качестве указателей памяти. Я озадачен тем, почему это произошло, но это устранило проблемы. Любые объяснения того, почему это произошло, будут оценены. Спасибо всем за помощь!

ИСХОДНОЕ СООБЩЕНИЕ:

Это немного странный вопрос, поскольку я столкнулся с этой проблемой во время выполнения урока по адресу: http://www.iphonegametutorials.com/2010/09/23/cocos2d-game-tutorial-building-a-slide-image-game /.

Программа, которую я ввел, работает, за исключением переключения плиток, и я заглянул в отладчик XCode, и кажется, что мои значения x и y для класса Tile устанавливаются на абсурдно высокие значения. Странно то, что когда значения передаются методу (initWithX:Y:) из исходного метода (initWithSize:imgSize:), они такие, какими они должны быть, но когда они поступают в метод, они огромны (например: в одном случае x передается как ‘1’становится «1065353216», когда оно поступает в метод.)

У меня такое чувство, что оно может указывать на ячейку памяти переданного int, но я не вижу никаких причин, по которым это должно быть в моем коде. Смотрите ниже.

 -(id)initWithSize:(CGSize)aSize imgSize:(int)aImgValue {
self = [super init];
imgValue = aImgValue;
size = aSize;
OutBorderTile = [[Tile alloc] initWithX:-1 Y:-1];
content = [NSMutableArray arrayWithCapacity:size.height];

readyToRemoveTiles = [NSMutableSet setWithCapacity:50];

for(int y = 0; y < size.height; y  ) {
    NSMutableArray *rowContent = [NSMutableArray arrayWithCapacity:size.width];
    for (int x = 0; x < size.width; x  ) {
        Tile *tile = [[Tile alloc] initWithX:x Y:y];
        [rowContent addObject:tile];
        [readyToRemoveTiles addObject:tile];
        [tile release];
    }
    [content addObject:rowContent];
    [content retain];
}
[readyToRemoveTiles retain];
return self;
}

-(id)initWithX:(int)posX Y:(int)posY {
self = [super init];
x = posX;
y = posY;
return self;
}
 

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

Я также отметил, что если я зайду в отладчик и вручную изменю значения PosX и posY в методе initWithX, код переключения плитки будет работать, поэтому моя проблема определенно связана с действительно большими значениями int, формируемыми в этом методе.

Редактировать для Джима: надеюсь, это показывает более полную картину макета, который у меня есть для объекта Tile.

 @interface Tile : NSObject {
int x, y, value;
CCSprite *sprite;
}

@property(nonatomic, readonly) int x, y;
@property(nonatomic) int value;
@property(nonatomic, retain) CCSprite *sprite;

@end

@implementation Tile

@synthesize x, y, value, sprite;

// Code is logged in below. 
-(id)initWithX:(int)posX Y:(int)posY {
self = [super init];
x = posX;
y = posY;
return self;
}

@end
 

Комментарии:

1. Опубликуйте код, в котором вы объявляете x y переменные экземпляра и, и код, в котором вы регистрируете значения.

2. если вы очищаете и перестраиваете, есть ли какое-либо предупреждение компилятора в [[Tile alloc] initWithX:x Y:y] строке?

3. Джим: Я отредактировал сообщение выше, чтобы показать инициализацию переменных экземпляра, и попытался показать, как регистрируется код. Если вы посмотрите на первый пример, вы можете увидеть, как я вызываю -(id)initWithX:Y: метод. hamstergene: я очистил и перестроил, но я не получил предупреждение компилятора.

4. Хорошо, я понял. Странно, но когда я сделал Tile * tile = [[Tile alloc] initWithX:x Y: y]; в: Tile * tile = [Tile alloc]; [tile initWithX: x Y: y]; Программа начала получать значения int правильно, а не как указатели, которые онавидел раньше. Любые объяснения относительно того, почему совместное вложение alloc и init может вызвать такое поведение?

Ответ №1:

Где- x y то указателю присваивается значение и / или. Одна вещь, которую я бы проверил, это убедиться, что вы не объявляете свои целые числа как указатели на целые числа. Т.Е. int *x и т. Д.

Комментарии:

1. Это именно то, что происходило, но я не слишком уверен, почему размещение моего alloc и моего оператора инициализации в одной строке привело к тому, что это произошло.