7

我正在编写一个应用程序,我需要将图像发送PNGJPG服务器。将 JPEG/PNG 图像转换为 Base64 字符串的代码,我编写为 Obj-C 块。但是当我尝试将块返回的字符串添加到NSDictionary我得到code=EXC_ARM_DA_ALIGN. 在我的项目中,我使用 ARC。我阅读了有关此问题 ARC 的几篇文章:EXC_BAD_ACCESS 当从块内部调用方法时,在委托方法内部所以我使用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++;
}
4

2 回答 2

4

NSDictionary 期望它的键和值是指向 Objective-C 对象的指针。你所拥有的image_size是一个 NSUInteger,它是一种原始类型(无符号长整数)。

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

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

或者,如果您有一个较旧的编译器,则如下所示:

[NSNumber numberWithUnsignedLong:image_size]

顺便说一句,我不确定在这种情况下是否使用块。似乎动机是有一个 __block 变量作为输出参数的等价物,仅此而已?您可能会考虑将其作为一个单独的函数或方法,将 aNSUInteger *作为输出参数。不是这里的直接问题,而是需要考虑清理一下的东西。

于 2013-07-07T12:24:26.117 回答
-1

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

于 2013-07-07T03:23:47.077 回答