Tôi đang viết một ứng dụng mà tôi cần gửi các hình ảnh PNG
và JPG
tới máy chủ. Mã để chuyển đổi hình ảnh JPEG/PNG thành chuỗi Base64 tôi đã viết dưới dạng khối Obj-C. Nhưng khi tôi cố gắng thêm chuỗi được trả về theo khối đến NSDictionary
Tôi nhận được code=EXC_ARM_DA_ALIGN
. Trong dự án của tôi, tôi sử dụng ARC. Tôi đã đọc một số bài viết về vấn đề này ARC: EXC_BAD_ACCESS when calling a method from inside a block, inside a delegate method Vì vậy, tôi sử dụng copy
! Nhưng nó đã không giúp tôi. Trước khi tôi sử dụng copy
tôi đã nhận EXC_BAD_EXCEPTION
với mã = 1 và bây giờ với mã trên tiêu đề. Đây là mã của tôi:Tại sao tôi có EXC_BAD_ACCESS_EXCEPTION (code = EXC_ARM_DA_ALIGN) khi sử dụng khối với 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++;
}
Đây có phải là tất cả nghĩa đen trong một phương pháp không? Vì vậy, các khối được tạo ra tại địa phương ngay trước khi bạn gọi nó? Hay bạn đã sao chép/dán mã từ các phương thức khác nhau? Ngoài ra, xin lưu ý rằng 'image_size' cần được đóng hộp trong NSNumber trước khi bạn thêm nó vào từ điển. Với trình biên dịch mới, bạn có thể thực hiện điều này bằng '@ (image_size)'. –
@ FirozeLafeer: Có vẻ như câu trả lời cho vấn đề! –
@FirozeLafeer có câu trả lời đúng – Danilo