2011-08-12 31 views
10

मैं एक पैटर्न फ़ंक्शन के हिस्से के रूप में स्मृति में बिटमैप बनाने की कोशिश कर रहा हूं जो ड्रॉलेयर: इनकॉन्टेक्स्ट: विधि (यह विधि कैलियर प्रतिनिधि प्रोटोकॉल का हिस्सा है) कॉल करेगी। पैटर्न समारोह इस के समान दिखता है:CGImageCreate को सही कॉल क्या लगता है जैसे इसके लिए डेटा प्रदाता ऐप द्वारा बनाई गई सरणी का उपयोग करता है?

static const size_t kComponentsPerPixel = 4; 
static const size_t kBitsPerComponent = sizeof(unsigned char) * 8; 

NSInteger layerHeight = 160; 
NSInteger layerWidth = 160; 
CGContextSaveGState(context); 

CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB(); 

size_t bufferLength = layerWidth * layerHeight * kComponentsPerPixel; 

unsigned char *buffer = malloc(bufferLength); 

// The real function does something more interesting with the buffer, but I cut it 
// to reduce the complexity while I figure out the crash. 
for (NSInteger i = 0; i < bufferLength; ++i) 
{ 
    buffer[i] = 255; 
} 
//memset(buffer, 255, bufferLength); 

CGDataProviderRef provider = 
CGDataProviderCreateWithData(NULL, &buffer, bufferLength, NULL);//freeBitmapBuffer); 

CGImageRef imageRef = 
CGImageCreate(layerWidth, layerHeight, kBitsPerComponent, 
       kBitsPerComponent * kComponentsPerPixel, 
       kComponentsPerPixel * layerWidth, 
       rgb, 
       kCGBitmapByteOrderDefault | kCGImageAlphaLast, 
       provider, NULL, false, kCGRenderingIntentDefault); 

CGContextDrawImage(context, CGRectMake(0, 0, 160, 160), imageRef); 

CGImageRelease(imageRef); 
CGDataProviderRelease(provider); 
CGColorSpaceRelease(rgb);  

CGContextRestoreGState(context); 

बाद में, जब drawLayer: InContext: इस समारोह के द्वारा बनाई गई पैटर्न प्रदर्शित करने के लिए कहता है CGContextFillRect, मैं EXC_BAD_ACCESS मिलता है। स्टैक का शीर्ष CGSConvertAlphaByte है। मैंने उस बिंदु पर बफर की स्मृति को देखा, और यह ठीक लग रहा था - पैटर्न फ़ंक्शन कहलाते समय इसे ठीक से सेट किया गया था।

मुझे लगता है कि शायद मैंने CGImageCreate के कुछ पैरामीटर को गड़बड़ कर दिया, संभवतः झंडे। या बफर सही क्रम में आबादी नहीं है, लेकिन मुझे यकीन नहीं है कि अगर मैं एक ही मूल्य के साथ प्रत्येक बाइट भरता हूं तो मैं गलत कैसे हो सकता हूं।

गैर-क्रैश होने वाले समान कोड के किसी भी विचार या उदाहरण?

उत्तर

4

ठीक है, इसलिए ऐप्पल देव मंचों ने गलती देखी: मैं & बफर को बफर के बजाय किसी कारण से गुजर रहा था।