#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 и моего оператора инициализации в одной строке привело к тому, что это произошло.