0

このコードは、ピッカー ビューから選択した画像のデータのチャンクを作成し、それを Web サイトにアップロードすることになっていますが、特定のチャンクをアップロードしようとするたびに、EXC_BAD_ACCESS が返されます。以下は、画像データを分割するためのコードです。チャンクで

PrimaryImageController.h

@interface PrimaryImageViewController
{
    __weak IBOutlet UIImageView *imgView;
}
@property (nonatomic,strong)    NSMutableArray *chunkArray;


PrimaryImageController.m
@synthesize imgView,chunkArray;


- (void)viewDidLoad
{
chunkArray=[[NSMutableArray alloc]init];
}

-(void)updateImage
{
UIImage *img = imgView.image;    
NSData *dataObj=UIImageJPEGRepresentation(img, 1.0);
NSUInteger length = [dataObj length];    
NSUInteger chunkSize = 3072*10;
NSUInteger offset = 0;
int numberOfChunks=0;
do
{
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
    NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[dataObj bytes] + offset
                                         length:thisChunkSize
                                   freeWhenDone:NO];
    offset += thisChunkSize;        
    [chunkArray insertObject:chunk atIndex:numberOfChunks];        
    numberOfChunks++;        
}    
while (offset < length);
for (int i=0; i<[chunkArray count]; i++)
{
    [uploadPrimary uploadImage:[chunkArray objectAtIndex:i] uuid:uniqueIdString numberOfChunks:[chunkArray count] currentChunk:i];
}
}
4

1 に答える 1

2

exc_bad_accessハード クラッシュを示します。それ以上でもそれ以下でもありません。多くの場合、オブジェクトを過度に解放するとこのような問題が発生しますが、このようなクラッシュが発生する理由は他にもたくさんあります。同様に、ハード クラッシュも例外ではありませんNSException。例外ブレークポイントを設定しても役に立ちません。

クラッシュが発生した場合は、バックトレースが必要です。クラッシュのバックトレースを投稿します。

ARC が有効になっている場合、これは内部ポインターの問題のように見えます。に含まれるデータへの一連の参照を作成していますが、再度dataObj参照することはありませんdataObj

そのループの[dataObj self];後に追加してみてください。for()

ただし、インスタンス変数である配列にチャンクを格納しているdataObjため、の寿命はその配列の寿命に結合する必要があります。つまり、配列をupdateImageメソッドに移動するか、iVar を強い参照に宣言しますdataObj

于 2013-03-14T17:51:58.057 に答える