2013-04-18 4 views
6
बनाने के लिए

मैं बहुत तरह 24bit आरजीबी डेटा की एक अहस्ताक्षरित चार * से एक NSImage बनाने हूँ:कोको स्मृति प्रबंधन जब initWithBitmapDataPlanes का उपयोग कर NSImage

NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] 
          initWithBitmapDataPlanes:(unsigned char **)&data 
          pixelsWide:gWidth 
          pixelsHigh:gHeight 
          bitsPerSample:8 
          samplesPerPixel:3 
          hasAlpha:NO 
          isPlanar:NO 
          colorSpaceName:NSCalibratedRGBColorSpace 
          bytesPerRow:gWidth*3 
          bitsPerPixel:24]; 

NSImage *img = [[NSImage alloc] initWithSize:NSMakeSize(gWidth, gHeight)]; 
[img addRepresentation:bitmap]; 
समस्या मैं आ रही

मैं बाद में अधिक सामान लिख रहा हूँ वह यह है कि 'डेटा' के लिए और मुझे पता है कि एनएसआईमेज इसकी एक प्रति नहीं बना रहा है। मैं कहता हूं कि क्योंकि अगर मैं बाद में अपने डेटा बफर में सभी 0 लिखता हूं तो छवि सभी काले हो जाती है।

मैं उद्देश्य सी के साथ संघर्ष कर रहा हूं इसलिए यदि यह छोटा है तो मेरे साथ सहन करें।

मैं 'डेटा' और कभी मुक्त यह तो बातें अच्छी तरह से काम करते हैं, लेकिन स्पष्ट रूप से लीक की स्थानीय प्रतिलिपि करते हैं:

unsigned char *copy_of_data = new unsigned char[len]; 
memcpy(copy_of_data, data, len); 

मैं या तो कर सकते हैं कैसे:

(1) बनाने initWithBitmapDataPlanes बनाने अपनी खुद की प्रतिलिपि और deallocation संभाल?

या (2) छवि के बाद उचित होने पर डेटा को स्वयं मुक्त करें, अब इसकी आवश्यकता नहीं है?

उत्तर

6

planes पैरामीटर के लिए NULL पास करना सबसे आसान हो सकता है। फिर, छवि प्रतिनिधि आवंटित और प्रारंभ करने के बाद, इसे -bitmapData के लिए पूछें और उसमें अपना डेटा कॉपी करें। यह दृष्टिकोण डॉक्स में सुझाव दिया है:

अगर विमानों शून्य है या शून्य संकेत की एक सरणी, इस विधि पर्याप्त स्मृति आवंटित छवि अन्य तर्कों द्वारा वर्णित धारण करने के लिए। आप फिर इस मेमोरी के लिए पॉइंटर्स प्राप्त कर सकते हैं (getPixel: atX: y: या बिटमैपडेटा विधि के साथ) और छवि डेटा भरें। इस मामले में, आवंटित स्मृति ऑब्जेक्ट से संबंधित होगी और मुक्त होने पर मुक्त हो जाएगी।

जोर जोड़ा गया।

+0

ओह! मैंने यह खो दिया। मैं इसे एक भंवर दे दूंगा और देख सकता हूं कि यह काम करता है या नहीं। – spartygw

+0

यह पूरी तरह से काम करता है! आपका बहुत बहुत धन्यवाद। – spartygw

1

docs here के अनुसार, NSBitmapImageRep विमान डेटा का स्वामित्व नहीं लेगा यदि यह आपके पास पास होने पर वैध है। ("जब ऑब्जेक्ट स्वयं मुक्त हो जाता है, तो यह बफर को मुक्त करने का प्रयास नहीं करेगा।")।

तो आप स्वयं ही हैं। पॉइंटर को छवि प्रतिनिधि को पॉइंटर के साथ डेटा में रखने के लिए सबसे आसान तरीका है, और जब कोई रिहा किया जाता है, तो दूसरे को मुक्त करें। (यानी, अगर उन्हें इवर के रूप में रखा जाता है या अस्थायी रूप से उपयोग किया जाता है।) यदि आप जीसी का उपयोग कर रहे हैं तो यह कठिन हो सकता है।

सबसे साफ, आप एक छोटी रैपर कक्षा भी बना सकते हैं जो कि छवि प्रतिनिधि ऑब्जेक्ट और डेटा पॉइंटर दोनों का मालिक है, और उस ऑब्जेक्ट के -finalize (या -dealloc) में, डेटा बफर से छुटकारा पाएं।

संबंधित मुद्दे