2010-01-24 4 views
0

NSMutableArray를 UIImages로 채우는 중 당황스러운 문제가 있습니다.NSMutableArray w/UIImage 객체로 채우는 중 문제가 발생했습니다.

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderMask; 
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

while(...)  // <--- Iterates through data sets 
{ 

      CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data, numBytes, NULL); 
      CGImageRef cImage = CGImageCreate(iw, ih, 8, 32, 4 * iw, colorSpace, bitmapInfo, provider, NULL, NO, renderingIntent); 
      UIImage *finalImage = [UIImage imageWithCGImage:cImage]; 


      [images addObject:finalImage]; // <--- Declared and instantiated earlier 

      [delegate sendImage:finalImage]; 

      CGImageRelease(cImage); 
      CGDataProviderRelease(provider); 
} 

CGColorSpaceRelease(colorSpace); 

[delegate operationCompletedWithImages:images]; 

이것이 코드 실행 방법입니다. 그래서 기본적으로 비트 맵 데이터의 다음 집합을 반환하는 while 문에서 함수를 실행하고 UIImage를 만들고이를 가변 배열에 저장합니다.

필자는 각 파일을 디스크에 쓴 다음 액세스하여 올바른 이미지 세트를 생성함으로써이 문제를 테스트했습니다. 문제는 배열을 사용하여 데이터를 메모리에 유지하고 어레이의 이미지 객체에 액세스 할 때 동일한 이미지를 계속 반복해서 가져 오는 것입니다. 이미지는 항상 세트의 마지막 이미지이기도합니다.

배열을 UIImageView 애니메이션 배열로 설정하고 NSTimer를 사용하여 내용을 테스트하여 내용을 테스트 해 보았습니다. 어느 쪽이든 그것은 반복적으로 반복되는 동일한 이미지 (마지막 이미지)입니다.

이 작업은 서브 클래 싱 된 NSOperation 객체 내에서 실행되므로 인터페이스를 차단하지 않습니다. 여기에 또 다른 흥미로운 점은 operationCompletedWithImages과 함께 보낸 이미지 배열이 나에게 sendImage 메시지를 사용하여 시도한 중복 이미지의 배열을 제공하고 위임 객체 내부의 다른 배열에 이미지를 저장할 때 (아마도 스레딩이라고 생각했을 때 발행물). 이것은 저에게 동일한 결과를주었습니다.

나는 1 주일 이상 계속 진행되지 않고있어왔다. 나는 그와 같은 것을 본 적이 없으며 비슷한 이슈를 가진 사람을 찾을 수 없습니다. 누군가이 문제를 해결하는 데 도움이된다고 생각하면 추가 정보를 제공하게되어 기쁩니다.

누구든지 도움을 제공 할 수 있다면 크게 감사하겠습니다.

답변

0

문제를 파악했습니다. 뒷받침 데이터 포인터 문제가되었습니다.

이전에 데이터에 액세스하고 있었을 때마다 새로운 내용으로 반복하고 덮어 쓸 것이라고 생각하고 새 내용을 내 CGDataProviderRef에 연결했습니다. 이것은 사실이 아니 었습니다. 기본적으로 공급자에 대한 동일한 백업 데이터에 대한 포인터를 제공했습니다. 해결책은 NSData 객체에 데이터를 복사하고 DataProvider에 해당 복사본을 사용하는 것이 었습니다.

그래서 대신은 :

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data, numBytes, NULL); 

은 다음과 같습니다

NSData *pxData = [[NSData alloc] initWithBytes:pFrameRGB->data length:numBytes]; 
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)pxData); 
0

이것이 문제가되는지는 확실하지 않지만 NSOperation이 실행되는 스레드가 아니라 주 스레드의 변경 사항을 대리인에게 알리고 있어야합니다.

[delegate performSelectorOnMainThread:@selector(sendImage:) withObject:finalImage waitUntilDone:YES]; 

마찬가지로 마지막 메시지입니다. 위임자가 UIKit 관련 내용을 수정하는 경우 이 주 스레드에서 호출되어야합니다!

+0

감사합니다! 그것은 올바른 방향으로 나아가는 단계입니다. 주 스레드에서 sendImage 선택기를 수행 할 때 나는 확실히 적절한 이미지를 얻고 있습니다. 이제 대리인 객체 (주 스레드)의 배열에 해당 이미지를 추가하려고합니다. 문제는 그들이 모두 추가되고 검토를 시도하면 모두 동일하다는 것입니다. 매우 이상합니다. 그래서 배경 스레드에서 적절한 이미지를 받고 있지만 어쨌든 배열은받은 마지막 이미지의 복사본을 저장하는 중입니다 ... –

+0

'모두 동일'이란 무엇을 의미합니까? 모든 이미지가 동일한 내용을 가지거나 똑같은 인스턴스 *입니까? 배열에 저장된 포인터 값을 확인하십시오! – PfhorSlayer

+0

렌더링이 동일합니다. 흥미로운 점은 UIImage & CGImageRef 포인터가 배열에서 고유하지만 배열의 모든 UIImage에 대한 NSObject -> ISA 주소가 동일하다는 것입니다. 이게 무슨 뜻인지는 모르겠지만 지금까지 찾을 수있는 유일한 연결입니다. 또한 10 개의 UIImage 인스턴스 변수를 선언하고 거기에 10 개의 이미지 집합을 저장하려고했습니다. 이것은 효과가있다! 그래서 문제는 배열 (내가 NSArray, CFArray 및 C 배열 - UIImage * 이미지 [...])를 시도한 배열에 이미지를 저장할 때 발생하는 것 같습니다. –

0

NSMutableArray가 추가되는 객체의 메모리 관리를 처리한다고 가정 할 수도 있지만, 아마도 C 레벨 Quartz 헬퍼/코어 래퍼를 다루고 있기 때문에 가능하지 않을 수 있습니다.

내가 실험 한 다른 이미지 조작 방법에서는 일반적으로 스레드와 관련된 자동 렌더링 풀에 포장되어 있습니다.

finalimage에서 release/autorelease를 실험 해 보셨습니까?

+0

나는 보유 카운트를 무용지물로 수정하여 놀았습니다. 어쨌든 배열에 중복 된 객체가 왜 생길지 이해할 수 없기 때문에 어쨌든 어둠 속에서 한 번 찍은 것 같습니다. 정말 내 머리가 회전이 - 대리인 개체 (주 스레드에서) 나는 sendImage 통해 보낸 및 각 새 UIImage CGImageRef CGImageRef CGImageRef 사용하여 이전에 새 복사본을 얻는 할당 한 배열에 추가. 나는 여전히 동일한 이미지의 배열을 반복해서 얻는다 (여전히 마지막 이미지가 추가된다). –

관련 문제