Сбой на iPad при инициализации CCTexture2D - PullRequest
0 голосов
/ 01 февраля 2012

После запуска приложения на iPad я вижу сбой приложения в функции initWithImage.Это не происходит на симуляторе.

@implementation CCTexture2D (Image)

- (id) initWithImage:(UIImage *)uiImage

... 

    // Create the bitmap graphics context

    switch(pixelFormat) {          
        case kCCTexture2DPixelFormat_RGBA8888:
        case kCCTexture2DPixelFormat_RGBA4444:
        case kCCTexture2DPixelFormat_RGB5A1:
            colorSpace = CGColorSpaceCreateDeviceRGB();
            data = malloc(POTHigh * POTWide * 4);
            info = hasAlpha ? kCGImageAlphaPremultipliedLast : kCGImageAlphaNoneSkipLast; 
//          info = kCGImageAlphaPremultipliedLast;  // issue #886. This patch breaks BMP images.
            context = CGBitmapContextCreate(data, POTWide, POTHigh, 8, 4 * POTWide, colorSpace, info | kCGBitmapByteOrder32Big);                
            CGColorSpaceRelease(colorSpace);
            break;

        case kCCTexture2DPixelFormat_RGB565:
            colorSpace = CGColorSpaceCreateDeviceRGB();
            data = malloc(POTHigh * POTWide * 4);
            info = kCGImageAlphaNoneSkipLast;
            context = CGBitmapContextCreate(data, POTWide, POTHigh, 8, 4 * POTWide, colorSpace, info | kCGBitmapByteOrder32Big);
            CGColorSpaceRelease(colorSpace);
            break;
        case kCCTexture2DPixelFormat_A8:
            data = malloc(POTHigh * POTWide);
            info = kCGImageAlphaOnly; 
            context = CGBitmapContextCreate(data, POTWide, POTHigh, 8, POTWide, NULL, info);
            break;                    
        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid pixel format"];
    }


    CGContextClearRect(context, CGRectMake(0, 0, POTWide, POTHigh));
    CGContextTranslateCTM(context, 0, POTHigh - imageSize.height);

===================
crash here
--->    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(CGImage), CGImageGetHeight(CGImage)), CGImage);

Этот файл загружен с помощью LevelHelper (файл png был создан с помощью SpriteHelper).Он отлично работает после первой загрузки.Он прерывается при попытке nect после обработки предупреждения о памяти (и очистки кеша текстур).Не могли бы вы помочь со следующими этапами расследования?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

ОК ... наконец-то понял:)

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

Тем не менее возникла проблема с пониманием того, почему на iPad malloc возвращает ненулевое значение дляпамять и на самом деле она повреждена.Но это вопрос к другой теме:)

Спасибо!

0 голосов
/ 01 февраля 2012

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

Это очень распространенная вещь в разработке для iOS, и этот тип ошибки довольно сложно отлаживать, но хорошей отправной точкой является установка для nszombieenabled значения true на этапе отладки. Проверьте эту тему, чтобы увидеть, как:

Как настроить NSZombieEnabled в Xcode 4?

Что касается сбоя вашего приложения на iPad, но не на симуляторе, это тоже довольно часто. Обычно выбор Product / Clean решит проблему, и приложение начнет падать как на симуляторе, так и на iPad.

Иногда это также помогает вернуть имитатору «заводские настройки» перед нажатием «Выполнить». Для этого выберите «Сбросить содержимое и настройки» в верхнем меню симулятора iOS. И, наконец, иногда полное удаление приложения с вашего iPad перед повторной компиляцией также помогает заставить их вести себя одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...