NSMutableArray вылетает приложение при добавлении объектов - PullRequest
0 голосов
/ 06 августа 2011

Я использую Xcode 4 с Cocos2D на Mac OS X 10.6.8. Я пытаюсь использовать спрайт лист для анимации. Вот код, который у меня есть:

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"scrollAnimation.plist"];
CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"scrollAnimation.png"];
[self addChild:spriteSheet];

NSMutableArray *animFrames = [NSMutableArray array];

for(int i = 0; i < 10; i++) {
    [animFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: [NSString stringWithFormat:@"scroll%d.png", i]]];
}

self.scrollAnim = [CCAnimation animationWithFrames:animFrames delay:0.05f];

self.scroll = [CCSprite spriteWithSpriteFrameName:@"scroll0.png"];
_scroll.position = ccp(_winSize.width*1.5, _winSize.height*1.5);
[spriteSheet addChild:_scroll]; 

Это нормально работает в симуляторе, но когда я получаю сборку устройства, он вылетает. Я сузил его до добавления объектов в массив. Если я закомментирую все до цикла for, то просто добавлю часть spriteFrameByName, она работает. Но когда я пытаюсь поместить это в массив, приложение вылетает на устройстве.

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 07 августа 2011

Одна причина, по которой я нашел вещи, работающие в симуляторе, но не работающие на устройстве, заключается в том, что имя файла напечатано неправильно. Я бы хотел убедиться, что имя scrollAnimation.plist на самом деле не является ScrollAnimation.plist или scrollanimation.plist, а с scroll0.png то же самое, что на самом деле оно не называется Scroll0.png

0 голосов
/ 06 августа 2011

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

Итак, чтобы исследовать проблему, я сначала проверил, есть ли следы предупреждений в памяти (если в covos2d включена трассировка) перед сбоем. Это было бы явным признаком.

На самом деле, есть второй возможный результат, когда вы получаете предупреждение памяти, которое также приводит к сбою. Ваше приложение получает предупреждение памяти (посмотрите на следы cocos2d); ваш кеш текстур очищается, поэтому, когда вы пытаетесь использовать текстуру, которую, как вы думали, предварительно кэшировали, приложение вылетает. Но в этом случае ошибка будет более многословной. Если вы думаете, что проблема связана с этим, посмотрите на этот пост: http://labs.freescapes.org/blog/2011/07/cocos2d-and-memory-warnings/

...