7

PNGサーバーにJPG画像を送信する必要があるアプリケーションを作成しています。JPEG/PNG 画像を Base64 文字列に変換するコードを Obj-C ブロックとして書きました。しかし、ブロックから返された文字列を追加しようとするとNSDictionarycode=EXC_ARM_DA_ALIGN. 私のプロジェクトでは、ARC を使用しています。この問題に関するいくつかの投稿を読みました ARC : EXC_BAD_ACCESS when calling a method from within a block, inside a delegate method copyしかし、それは私を助けませんでした.使用する前に、私はコード= 1copyを取得し、現在はタイトルにコードを使用しています. EXC_BAD_EXCEPTIONこれが私のコードです:

  __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のは、プリミティブ型(unsigned long)であるNSUIntegerです。

したがって、プリミティブ型の値を NSDictionary に格納するには、それを NSNumber または NSValue でラップする必要があります。新しいバージョンの LLVM では、次のように簡単に表現できます。

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

または、古いコンパイラを使用している場合は、次のようになります。

[NSNumber numberWithUnsignedLong:image_size]

ちなみに、この場合のブロックの使用についてはよくわかりません。動機は、__block 変数を out パラメータと同等のものとして使用することだったようですが、それ以上のものはありませんか? NSUInteger *を out パラメーターとして受け取る別の関数またはメソッドにすることを検討することもできます。ここで差し迫った問題ではありませんが、これを少し整理するために考慮すべきことがあります。

于 2013-07-07T12:24:26.117 に答える