2011-08-09 2 views
1

고정 : 아직 확실하지 않습니다. 코드가 아래에 업데이트되었으며 하단에 메모가 있습니다CGImage/UIImage 전달은 EXE-BAD-ACCESS가 발생합니다.

모든 좀비 및 디버그 옵션을 설정하지 않으면 시뮬레이터에 표시되지 않는 매우 이상한 오류가 발생합니다 (Instruments 실행시에도). 그러나 업데이트 (1 초당 1 회 업데이트) 후 전화가 끊어집니다. 나는 2D 배열을 가지고 있는데, 서브맵을 취하고, 색상 맵을 적용하고, 이미지로 변환한다 (이 배열은 끊임없이 변한다). 그런 다음 해당 이미지를 모델로 전달하고 viewcontroller는 업데이트 알림을 받으면이를 모델에서 가져옵니다. 나는 3 개 클래스 -Spectrogram, 모델,의 ViewController 레이아웃 것 : 여기

를 각각의 중요한 비트입니다 (더 있지만 관련이없는이) :

Spectrogram.h (미안 해요, 난 얻을 수 없다 이

@interface: Spectrogram : NSObject 
{ 
    NSMutableData *arrayData; 
} 
//renamed so Xcode allows the object with +1 reference count to be returned 
- (CGImageRef)newSpectrogramImage; 

Spectrogram.m) 여기에서 제대로 들여 쓰기

@implementation Spectrogram 
- (CGImageRef)newSpectrogramImage 
{ 
    //slightly reordered 
    NSMutableData *imageData = [[NSMutableData alloc] init]; 
    ...code to go through arrayData and colormap it (get RGB transform) and store in imageData... 
    CGImageRef arrayImage = nil; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    //specifically tell CGImage there is no alpha channel 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNone; 
    //Use the toll-free bridge between NSData and CFData 
    CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)imageData); 
    arrayImage = CGImageCreate((slices-startSlice), bins, 8, 24, 3*(slices-startSlice), colorSpace, bitmapInfo, provider, NULL, false, kCGRenderingIntentDefault); //image is rotated now, so width and height are switched 
    CGColorSpaceRelease(colorSpace); 
    CGDataProviderRelease(provider); 
    CGImageRelease(arrayImage); 
    [imageData release]; 
    //Pass the CGImageRef with a reference count of 1 
    return arrayImage; 
} 

Model.h

0 1,

Model.m

@implementation Model 
... there is a function that adds new data to the array and notifies all listeners... 
- (CGImageRef)newSpectrogramImage { 
    return [spectrogram newSpectrogramImage]; 
} 

내가 사냥하려고 마지막 날이 너무 많은 시간을 변경 한

@implementation ViewController 
@synthesize spectrogramView; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter ... listen for model updates... 
} 

//now, the real meat 
- (void)recordUpdated:(NSNotification*)notification 
{ 
    CALayer *myLayer = self.view.layer; 
    CGImageRef spectrogramImage = nil; 
    spectrogramImage = [currentRecord newSpectrogramImage]; 
    myLayer.contents = (id)spectrogramImage; 
    CGImageRelease(spectrogramImage); 
} 

ViewController.h

@interface: ViewController : UIViewController 
{ 
} 
//the root controller actually alloc's the record, and sets this property when creating this view 
@property (nonatomic, retain) Record *currentRecord; 

ViewController.m 어디에서 왜 실패 하는가. 대신 CGImageRef를 전달해 보았습니다. (객체가 아니기 때문에 - 큰 이미지 일 수있는 부분을 복사하는 것에 대해 걱정이됩니다.) 여전히 실패합니다. 그리고 시뮬레이터에서 완벽하게 작동합니다 (수십 분 동안 실행됩니다). 하지만 아이폰에 대한 분 이내에 실패하거나 시뮬레이터에 대한 디버그 옵션을 켜면 (viewcontroller가로드되자 마자 실패합니다).

참고로, 다소 유용 할 수 있습니다. 이 viewcontroller는 휴대폰이 옆으로 돌릴 때 모달보기로로드됩니다 (훌륭하게 작동합니다). 그러나 NSLogs가 많이 있는데 mainviewcontroller가 viewwilldisappear에 도착하기 전에이 viewcontroller의 dealloc이 호출된다는 것을 알았지 만 여전히 실행됩니다. 전화가 되돌아 와서 뷰가 사라지면이 컨트롤러의 dealloc이 다시 호출됩니다.

대신 UIImages의, 모든 방법의 ViewController에 시뮬레이터 통과 CGImageRefs에서 잘 작동 버전입니다. 나는 CGImage에서 UIImage를 생성 할 수있는 곳의 조합을 50 가지 이상 시도했으며, 위에 게시 된 것은 그 중 하나 일뿐입니다 (모두 결국 또는 즉시 실패합니다). 나는의 ViewController modelUpdated이를 추가 할 경우 참고로, 위의 코드와 함께 :

CGSize size = currentModel.spectrogramImage.size; 
NSLog(@"width: %f", size.width); 

을하고 spectrogramView에 할당 주석있는 UIImage가 함께 전달지고 있으므로, 폭은 그것은 단지, 제대로보고 유지되지 않음 (이것은 EXE_BAD_ACCESS 오류를 이해하는 방법입니다).

또한, 최근에 나는

self.spectrogramImage = [spectrogram getSpectrogramImage]; 

줄에 단 EXE_BAD_ACCESS을받을 수 있습니다. 그래서, 나는 그 오류가 스펙트로 그램 클래스 안에 있다고 생각합니다. CGImage와 UIImage 코드는 Apple 예제에서 가져 왔지만. 없이있는 UIImage 중개 -

고정 노트 는 내가있는 CALayer의 내용을 설정하는 것은보기에 CGImageRef를 전달하는 매우 빠른 방법이라고 읽습니다. 불행히도, 나는 일하는 변화 만하기 때문에, 내가 겪은 모든 반복을 볼 수는 없다. 그러나, 나는 충돌이 계속되는 몇 번과 매우 비슷한 것을 가지고 있음을 안다. 문제는 항상 현재 작성된대로 프로그램이 EXE_BAD_ACCESS와 충돌하는 것입니다. 참조 횟수를 올리거나 해제하지 않으면 완벽하게 작동하지만 개체가 누출됩니다. 나는 그것이 가능하다는 것을 아직도 이해하지 못한다. 누출과 BAD ACCESS의 차이가 1의 참조 카운트가됩니다 (2 이상이 아님).

+0

나쁜 접속은 어떻게됩니까? – sergio

+0

self.spectrogramView.image = line이있는 경우에만 발생합니다. 내가 그걸 언급하면 ​​뷰는 쓸모가 없지만 모델은 여전히 ​​이미지를 자체 ivar로 저장하고 있지만 충돌하지는 않습니다. 이것은 UIImage *에서 CGImageRef로 전달 된 객체를 전환하더라도 마찬가지입니다. –

+0

좋습니다, 그래서 당신이 코드를 게시해야한다고 생각합니다 : alloc/init'spectrogramView', 그리고 당신이 그 객체로하는 모든 관련; alloc/init'currentModel'과 그 객체로 무엇이든 할 수 있습니다 ... – sergio

답변

1

귀하의 특정 질문에 답변을 드릴 수는 없지만 조금 더 잘되어 가고 있는지 알 수 있습니다. 나는 "logMemUsage"함수를 사용하여 메모리 사용량을 출력하고 지난 시간 이후 얼마나 많이 변경되었는지를 보여줍니다. 1 초에 한 번 호출하면 앱에서 메모리가 어떻게 사용되고 있는지 더 잘 이해할 수 있습니다. 그것이 계속 성장한다면 분명히 누수가 있습니다. 예상대로 위아래로 간다면 좋을 것입니다. 그렇게 생각하지 않을 때 내려 가지 않으면, 보게 될 것입니다. Utilities.h/.m의 github here에 있습니다.

+0

인스 트루먼 트의 메모리 사용량을 예상하고 예상대로 증가합니다 (~ 1MB/hr). 배열 (3 개 있음)은 수신 된 데이터에 지속적으로 추가됩니다. 이는 디자인의 일부이며 분석 응용 프로그램입니다. 현재 레코딩이 닫히면 Core Data가 저장하는 데이터를 압축하기 위해 정리 작업을 수행하고 레코딩을 검토 할 때 파생 데이터 (예 : 스펙트로 그램 배열 및 이미지)를 압축 해제하거나 다시 만듭니다. 인 스트 루먼트는 누출 물이 없다고 말합니다. 나는 Quartz2D가 메모리에 문제가있을 수 있다는 것을 읽었다. –

1

게시 한 내용에서 파악하기는 어렵지만 할당 된 모든 데이터에 대해 보유와 속성을 사용하지 않는 이유는 무엇입니까? 예를 들어, getSpectrogramImage에서 자동 렌더링 된 UIImage를 반환하면 self.spectrogramImage = [spectrogram getSpectrogramImage];라는 호출로 Model에 저장되지만, spectrogramImage에 대한 속성은 없습니다. 자기를 사용해서. 기구. 당신이 그것을 게시하는 것을 귀찮게하지 않았다는 것입니까? 그것이 쓰여지는 방법은 자동 접기가 될 수 있고 그것을 사용하려고 할 때 ...

+0

+1,'Model'의'spectrogramImage'는'@property (retain)'을 필요로합니다. – darvids0n

+0

죄송합니다. model.h가 잘못 작성되었습니다 (즉, 잘라내어 붙여 넣기를하고 메모리에서 일부 작업을하는 것입니다). spectrogramImage가 유지됩니다. –

관련 문제