메모리 오류가 발생합니다. 메모리 사용량이 기하 급수적으로 증가하기 때문에 메모리 오류가 발생합니다. 분명히 나는 어떤 것을 공개하지 않을 것이다. 어떤 아이디어일지도 모른다.ALAssetsLibrary에 액세스하는 중 메모리 오류가 발생했습니다.
다음은 UI 이미지에있는 빨간색 픽셀을 확인하는 방법입니다. 카운트를 반환합니다.
- (NSUInteger)getRedPixelCount:(UIImage*)image
{
NSUInteger numberOfRedPixels = 0;
struct pixel* pixels = (struct pixel*) calloc(1, image.size.width * image.size.height * sizeof(struct pixel));
if (pixels != nil)
{
CGContextRef context = CGBitmapContextCreate((void *) pixels,
image.size.width,
image.size.height,
8,
image.size.width * 4,
CGImageGetColorSpace(image.CGImage),
(CGBitmapInfo)kCGImageAlphaPremultipliedLast);
if (context != NULL)
{
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), image.CGImage);
NSUInteger numberOfPixels = image.size.width * image.size.height;
while (numberOfPixels > 0) {
if (pixels->r == 255) {
numberOfRedPixels++;
}
pixels++;
numberOfPixels--;
}
CGContextRelease(context);
}
}
return numberOfRedPixels;
}
이는 사진 라이브러리의 이미지를 반복하고 자신의 붉은 각 픽셀을 결정하는 코드입니다.
[self.library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
[group setAssetsFilter:[ALAssetsFilter allPhotos]];
[group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){
if (asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref){
UIImage *myImage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]];
NSLog(@"%i", [self getRedPixelCount:myImage]);
}
}
}];
}
} failureBlock:^(NSError *error) {
NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];
감사합니다, C.
주기적으로 'fullResolutionImage'를 호출하는 것은 좋지 않다고 생각합니다. 이것은 당신의 코드에서 메모리 문제를 만드는 아주 좋은 후보입니다. 어쨌든 인스 트루먼 트에서 코드를 프로파일 링하고 정확히 무슨 일이 일어나는지 볼 수 있습니다. – faviomob