为什么在使用带ARC的块时我得到了EXC_BAD_ACCESS_EXCEPTION(代码= EXC_ARM_DA_ALIGN)?

时间:2013-07-06 18:32:49

标签: ios objective-c objective-c-blocks

我正在编写一个应用程序,我需要将PNGJPG图像发送到服务器。将JPEG / PNG图像转换为Base64字符串的代码我写为Obj-C块。但是当我尝试将块返回的字符串添加到NSDictionary时,我得到了code=EXC_ARM_DA_ALIGN。在我的项目中,我使用ARC。我读了几个关于这个问题的帖子 ARC: EXC_BAD_ACCESS when calling a method from inside a block, inside a delegate method所以我使用copy!但它没有帮助我。在我使用copy之前,我得到EXC_BAD_EXCEPTION代码= 1,现在标题上有代码。 这是我的代码:

  __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++;
}

2 个答案:

答案 0 :(得分:4)

NSDictionary期望其键和值成为Objective-C对象的指针。你在image_size中拥有的是NSUInteger,它是一种原始类型(unsigned long)。

因此,为了在NSDictionary中存储基本类型的值,您必须将其包装在NSNumber或NSValue中。使用较新版本的LLVM,这是一个简单的表达方式:

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

或者,如果你有一个较旧的编译器,那么这样的东西:

[NSNumber numberWithUnsignedLong:image_size]

顺便说一下,我不确定在这种情况下使用块。似乎动机是将__block变量作为out参数的等价物,仅此而已?您可以考虑将其作为一个单独的函数或方法,将NSUInteger *作为out参数。这不是当前的问题,但需要考虑清理一下这个问题。

答案 1 :(得分:-1)

很难完全确定,但您应该尝试做的是本地化所有变量。如果在多个方法中使用相同的变量,ARC有时不会引用一个变量的计数。我有一个与此类似的问题,我本地化了所有变量,它停止了EXC_BAD_ACCESS。希望我帮忙。