Sto scrivendo un'applicazione in cui è necessario inviare le immagini PNG
e JPG
al server. Codice per trasformare l'immagine JPEG/PNG nella stringa Base64 Ho scritto come blocco Obj-C. Ma quando ho provato ad aggiungere una stringa restituita per blocco a NSDictionary
ho ottenuto code=EXC_ARM_DA_ALIGN
. Nel mio progetto uso ARC. Ho letto diversi post su questo problema ARC: EXC_BAD_ACCESS when calling a method from inside a block, inside a delegate method Quindi io uso copy
! Ma non mi ha aiutato. Prima di usare copy
ho ottenuto EXC_BAD_EXCEPTION
con codice = 1 e ora con il codice sul titolo. Ecco il mio codice:Perché ho ottenuto EXC_BAD_ACCESS_EXCEPTION (codice = EXC_ARM_DA_ALIGN) quando uso i blocchi con ARC?
__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++;
}
Tutto questo è letteralmente in un unico metodo? Quindi il blocco viene creato localmente prima di chiamarlo? O hai copiato/incollato il codice da diversi metodi? Inoltre, tieni presente che 'image_size' deve essere inserito in un NSNumber prima di aggiungerlo al dizionario. Con un nuovo compilatore, puoi farlo con '@ (image_size)'. –
@FirozeLafeer: sembra la risposta al problema! –
@FirozeLafeer ha la risposta giusta – Danilo