2012-10-27 20 views
7

aşağıdaki hata ile bir kilitlenme karşı karşıyayım:Kilitlenme CGDataProviderCreateWithCopyOfData: vm_copy başarısız oldu: durum 1

"CGDataProviderCreateWithCopyOfData: vm_copy failed: status 1."

ben birden fazla soru varsa ve yardımcı olabilir.

  1. Vm_copy'de durum 1 ne anlamadı?

  2. Bu kilitlenme, yalnızca veri kopyasının iç döngüsü için bir kesme noktası belirlediğimde gerçekleşir. Ve sonra yeniden başlatın ve kesme noktasını kaldırın. Kesme noktası yoksa, işlev yürütülür, ancak boş bir resim alırım. Bir kırılma noktası belirlemesem bile, bu tür kilitlenmeler yakalanır ve uygulama yürütmeyi durdurur? Ben CGBitmapContextCreateImage yürüttüğünüzde

  3. Bu hata

    gelir. Bunu nasıl çözeceğini bilen var mı?

-(UIImage *) convertBitmapRGBA8ToUIImage:(UInt8**)img 
            :(int) width 
            :(int) height 
{ 

CGImageRef inImage = m_inFace.img.CGImage; 

UInt8*piData = calloc(width*height*4,sizeof(UInt8)); 

int iStep,jStep; 
for (int i = 0; i < height; i++) 
{ 
    iStep = i*width*4; 
    for (int j = 0; j < width; j++) 
    { 
     jStep = j*4; 
     piData[iStep+jStep] =img[i][j]; 
     piData[iStep+jStep+1] =img[i][j]; 
     piData[iStep+jStep+2] = img[i][j]; 

    } 
} 

CGContextRef ctx = CGBitmapContextCreate(piData, 
             CGImageGetWidth(inImage), 
             CGImageGetHeight(inImage), 
             CGImageGetBitsPerComponent(inImage), 
             CGImageGetBytesPerRow(inImage), 
             CGImageGetColorSpace(inImage), 
             CGImageGetBitmapInfo(inImage) 
             ); 

CGImageRef imageRef = CGBitmapContextCreateImage(ctx); 
UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 
CGContextRelease(ctx); 
CGImageRelease(imageRef); 
free(piData); 
return finalImage; 

} 

cevap

5

kern_return.h başlık dosyası verir:

#define KERN_INVALID_ADDRESS  1 
    /* Specified address is not currently valid. 
    */ 

Bu vm_copy failed: status 1 ilgili hata koduna karşılık gelir.

vm_copy documentation, adresinin [sayfalar] sayfa sınırında olması gerektiğinden, bunun bellek hizalama ile ilgili bir sorun olduğundan şüpheleniyorum.

Eğer inImage giriş görüntüsünün daha aynı adımlarla birlikte piData tampon ayırmalı, düzgün hizalanmış tamponları ile çalıştığından emin olmak için:

size_t bytesPerRow = CGImageGetBytesPerRow(inImage); 
UInt8*piData = calloc(bytesPerRow*height,sizeof(UInt8)); 

Sonra for döngü içinde yerine width*4 bu bytesPerRow değeri kullanmak, yani:

iStep = i*bytesPerRow; 

Bu sorunu (: Ben CGImageGetWidth(inImage) ve width aynı olduğu varsayılır) çözmek gerekir.

+0

Evet, bellek hizalama sorunuydu. Görüntü yönelimini düşünmüyordum. CGimage için farklı genişlik ve yükseklik verdi. Eğer belirttiği gibi bu bellek mis hizalama neden oldu. Cevap için teşekkürler. – Jailbroken

İlgili konular