2013-07-06 7 views
6

मैं एक आवेदन जहाँ मैं सर्वर से PNG और JPG छवियों को भेजने की जरूरत है लिख रहा हूँ। जेपीईजी/पीएनजी छवि को बेस 64 स्ट्रिंग में बदलने के लिए कोड मैंने ओबीजे-सी ब्लॉक के रूप में लिखा था। लेकिन जब मैंने ब्लॉक द्वारा NSDictionary पर स्ट्रिंग को जोड़ने की कोशिश की तो मुझे code=EXC_ARM_DA_ALIGN मिला। मेरी परियोजना में मैं एआरसी का उपयोग करता हूं। मैंने इस समस्या पर कई पोस्ट पढ़े हैं ARC: EXC_BAD_ACCESS when calling a method from inside a block, inside a delegate method तो मैं copy का उपयोग करता हूं! लेकिन इससे मेरी मदद नहीं हुई। इससे पहले कि मैं copy का उपयोग करता हूं, मुझे EXC_BAD_EXCEPTION कोड = 1 के साथ मिला और अब शीर्षक पर कोड के साथ।एआरसी के साथ ब्लॉक का उपयोग करते समय मुझे EXC_BAD_ACCESS_EXCEPTION (कोड = EXC_ARM_DA_ALIGN) क्यों मिला?

__block NSUInteger image_size; 

//Obj-C block where PNG or JPEG image converts to Base64 string 

    NSString* (^ToBase64)(UIImage* imageToConvert, NSMutableDictionary* metadata) = 

    ^(UIImage* imageToConvert, NSMutableDictionary* metadata) 
{ 
    NSMutableData *rawData = [NSMutableData data]; 
    NSString* encodedImage ; 
    if ([(NSString*)[metadata objectForKey:@"extension"] isEqualToString:@"PNG"]) 
    { 
     [rawData setData:UIImagePNGRepresentation(imageToConvert)]; 
     [Base64 initialize]; 
     encodedImage = [Base64 encode:rawData]; 
     image_size = [rawData length]; 

    } 
    else if ([(NSString*)[metadata objectForKey:@"extension"] isEqualToString:@"JPG"]) 
    { 
     [rawData setData:UIImageJPEGRepresentation(imageToConvert, 1.0)]; 
     [Base64 initialize]; 
     encodedImage = [Base64 encode:rawData]; 
     image_size = [rawData length]; 
    } 
    return encodedImage; 
} ; 

//Initialize dictionary with image data and metadata to send 
int iteration = 0; 
for (UIImage* currentEntry in imagesToSent) 
{ 
    NSMutableDictionary* currentImageMetadata = (NSMutableDictionary*)[imagesMetadata objectAtIndex:iteration]; 

    [uploadMessage setObject:[[NSMutableDictionary alloc] initWithObjectsAndKeys: 

    [ToBase64(currentEntry,currentImageMetadata) copy],@"image_data", //here I got an exception 
    [currentImageMetadata objectForKey:@"extension"], @"extension", 
           [currentImageMetadata objectForKey:@"image_name" ], @"image_name", image_size, @"size", nil] 

    forKey:[NSString stringWithFormat:@"image%d",iteration]]; 
    iteration++; 
} 
+3

क्या यह सब सचमुच एक विधि में है? तो ब्लॉक को कॉल करने से पहले स्थानीय रूप से सही बनाया गया है? या आपने अलग-अलग तरीकों से कोड कॉपी/पेस्ट किया है? साथ ही, इसे ध्यान में रखें कि 'image_size' को एनएसएनंबर में शब्दकोश में जोड़ने से पहले बॉक्सिंग करने की आवश्यकता है। एक नए कंपाइलर के साथ, आप इसे '@ (image_size) 'के साथ कर सकते हैं। –

+0

@FirozeLafeer: यह समस्या का जवाब जैसा दिखता है! –

+0

@FirozeLafeer का सही उत्तर – Danilo

उत्तर

4

NSDictionary इसकी कुंजी और मूल्यों ऑब्जेक्टिव-सी वस्तुओं के लिए संकेत हो जाता है। image_size में आपके पास एक NSUInteger है, जो एक आदिम प्रकार (हस्ताक्षरित लंबा) है।

तो आदेश एक NSDictionary में एक आदिम प्रकार के एक मूल्य के स्टोर करने के लिए आप एक NSNumber या NSValue में लपेट के लिए है। LLVM के नए संस्करण के साथ, कि एक आसान अभिव्यक्ति है:

[NSNumber numberWithUnsignedLong:image_size]

आशा है कि मदद करता है:

@(image_size) // this will give you an NSNumber *

या आप एक पुराने संकलक तो कुछ इस तरह है।

Btw, मैं इस मामले में एक ब्लॉक के उपयोग के बारे में निश्चित नहीं हूँ। ऐसा लगता है कि प्रेरणा एक __block चर के बाहर पैरामीटर के बराबर थी और कुछ और नहीं था? आप इसे एक अलग फ़ंक्शन या विधि बनाने पर विचार कर सकते हैं जो आउट पैरामीटर के रूप में NSUInteger * लेता है। यहां तत्काल मुद्दा नहीं है, लेकिन कुछ इसे साफ करने के लिए विचार करने के लिए कुछ।

+0

टैंक मैन! बहुत बढ़िया जवाब। आपने वास्तव में मेरी मदद की। क्या आप मुझे एक संदर्भ दे सकते हैं जहां मैं नए मुक्केबाजी वाक्यविन्यास के बारे में अधिक पढ़ सकता हूं: @ (image_size)। मैंने इसके बारे में नहीं सुना। – MainstreamDeveloper00

+0

@ हैरी कैटर, यहां बॉक्स किए गए अभिव्यक्तियों और अन्य संबंधित परिवर्तनों पर दस्तावेज़ है: http://clang.llvm.org/docs/ObjectiveCLiterals.html –

-1

यह पूरी तरह से सुनिश्चित करने के लिए कठिन है, लेकिन अपने चर के सभी स्थानीयकृत तुम क्या कर प्रयास करना चाहिए है: यहाँ मेरी कोड है। कभी-कभी एआरसी एक चर के लिए गणना का संदर्भ नहीं देता है यदि आप एक ही चर का उपयोग कई तरीकों से कर रहे हैं। मुझे एक बार इस तरह की समस्या थी और मैंने सभी चर को स्थानांतरित कर दिया और यह EXC_BAD_ACCESS को रोक दिया। उम्मीद है कि मैंने मदद की।

+2

आप किसके बारे में बात कर रहे हैं? ओबीजेसी रनटाइम सबकुछ बदलता है जिसे एक बरकरार रखा जा सकता है और रिलीज किया जा सकता है, और यह '__unsafe_unretained' नहीं है। एआरसी किसी भी उचित रूप से परिभाषित "प्रबंधन" को नहीं भूलता है। तथ्य यह है कि एक चर का जीवनकाल अप्रत्याशित था आपकी खुद की गलती है। – CodaFi

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