2016-05-25 2 views
1

Когда я создаю CIImage, вызывая эту процедуру, я получаю ошибку malloc в заголовке. Когда я вызываю initWithBitmapData напрямую (не в рамках процедуры createCIUimageFromData), тогда он работает нормально.Выдача указателя Malloc не была назначена при вызове initWithBitmapData

Я видел ссылки на возможные ошибки в iOS, которые могут быть связаны, но я не могу точно сказать, и я, конечно, подозреваю, что мой код больше, чем у Apple!

Мое предположение - это то, что мое дополнительное перенаправление закручивает вещи, но чище иметь отдельную процедуру, чем внедрять код везде, где он мне нужен.

спасибо.

Сбой:

- (CIImage *) createCIimageFromData : (unsigned char *)pData width : (int32_t)width height : (int32_t)height 
{ 

    /* 
    Once we have the raw data, we convert it into a CIImage. 
    The following code does the required work. 
    */ 
    NSLog(@"entering createciimage\n"); 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray(); 

    NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ]; 
    CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef]; 

    CGColorSpaceRelease(colorSpaceRef); 

    /* 
    newImage is the final image 
    Do remember to release the allocated parts. 
    */ 
    NSLog(@"done ciimage\n"); 
    return _dataCIImage; 
} 

Работы:

void prepData(unsigned char *pData, // source-destination 
          int strideSrc, // stride 
          int width, 
          int height, 
          double amount, 
          int deltaLimit, 
          id owner) 
{ 

    //[owner createCIimageFromData:pData width:width height:height]; // <-- commented out 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray(); 

    NSData *_pixelsData = [NSData dataWithBytesNoCopy:pData length:(sizeof(unsigned char)*width*height) freeWhenDone:YES ]; 
    CIImage *_dataCIImage = [[CIImage alloc] initWithBitmapData:_pixelsData bytesPerRow:(width*sizeof(unsigned char)) size:CGSizeMake(width,height) format:kCIFormatR8 colorSpace:colorSpaceRef]; 

    CGColorSpaceRelease(colorSpaceRef); 

// . . . 
} 
+0

Попробуйте 'freeWhenDone: NO' и освободите данные после того, как вы закончите с' CIImage'. – user3386109

+0

Спасибо, что, похоже, сделали эту работу! Если вы добавите его в качестве ответа, я могу указать, что это был ответ. – user938797

+0

@ user938797 Давайте подождем и посмотрим, может ли кто-нибудь сказать вам *** почему *** это ответ. Я просто догадывался :) Было бы полезно узнать, что происходит за кулисами, что вызывает проблему. Поэтому мы все знаем, чего следует избегать в будущем. – user3386109

ответ

1

Очевидно, что проблема возникает, когда объект NSData пытается освободить данные. Чтобы избежать этой проблемы, используйте freeWhenDone:NO, а затем освободите данные после завершения работы с помощью CIImage.

+0

Проблема с методами 'NoCopy' (независимо от' freeWhenDone') заключается в том, что вы должны убедиться, что буфер данных, на который указывает 'pData' и ссылающийся на объект NSData, живет до тех пор, пока объект' NSData' , который, скорее всего, будет сохранен «CIImage». Таким образом, он должен жить так же долго, как и «CIImage». И, поскольку оба они подсчитаны, неизвестно, как долго они будут жить. Они могут жить в прошлом, когда вы отпустите свою последнюю сильную ссылку на них, потому что любой код, который они когда-либо проходили, мог сохранить их по любой причине. –

+0

Спасибо, Ken Thomases, что тоже помогает. – user938797