Piszę aplikację, w której muszę wysyłać obrazy PNG
i JPG
na serwer. Kod do przekształcania obrazu JPEG/PNG na ciąg Base64, który napisałem jako blok Obj-C. Ale gdy próbowałem dodać ciąg zwracany przez blok do NSDictionary
, otrzymałem code=EXC_ARM_DA_ALIGN
. W moim projekcie używam ARC. Czytałem kilka postów dotyczących tego problemu ARC: EXC_BAD_ACCESS when calling a method from inside a block, inside a delegate method Używam więc copy
! Ale to mi nie pomogło. Zanim użyję copy
, otrzymałem EXC_BAD_EXCEPTION
z kodem = 1 i teraz z kodem na tytule. Oto mój kod:Dlaczego otrzymałem EXC_BAD_ACCESS_EXCEPTION (code = EXC_ARM_DA_ALIGN), gdy używam bloków z 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++;
}
Czy to wszystko dosłownie w jedną metodę? Więc blok jest tworzony lokalnie, zanim go nazwiesz? A może skopiował/wkleił kod z różnych metod? Pamiętaj też, że 'image_size' musi być umieszczony w NSNumber przed dodaniem go do słownika. Z nowym kompilatorem możesz to zrobić za pomocą '@ (image_size)'. –
@FirozeLafeer: To wygląda na odpowiedź na problem! –
@FirozeLafeer ma właściwą odpowiedź – Danilo