고정 : 아직 확실하지 않습니다. 코드가 아래에 업데이트되었으며 하단에 메모가 있습니다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 이상이 아님).
나쁜 접속은 어떻게됩니까? – sergio
self.spectrogramView.image = line이있는 경우에만 발생합니다. 내가 그걸 언급하면 뷰는 쓸모가 없지만 모델은 여전히 이미지를 자체 ivar로 저장하고 있지만 충돌하지는 않습니다. 이것은 UIImage *에서 CGImageRef로 전달 된 객체를 전환하더라도 마찬가지입니다. –
좋습니다, 그래서 당신이 코드를 게시해야한다고 생각합니다 : alloc/init'spectrogramView', 그리고 당신이 그 객체로하는 모든 관련; alloc/init'currentModel'과 그 객체로 무엇이든 할 수 있습니다 ... – sergio