이 점이 나를 미치게합니다. 최근 NSData 객체의 OpenGL 뷰에서 이미지 데이터를 저장하는 일부 코드를 소개하고이를 코어 데이터에 저장합니다. 이것을 검색하고이 픽셀 데이터를 텍스처로 다시 그려 넣으려고하면 EXC_BAD_ACCESS 오류가 발생합니다. 나를 위해이 매우 실망하고있다 무엇장치의 EXC_BAD_ACCESS (NSData/OpenGL 관련?)를 좌절 시킴 - 시뮬레이터에서 정상적으로 작동 함
- (void)drawDrawingFromData:(NSData *)data {
if (data != nil) {
[renderer prepareRetainedBuffer];
/* Prepare data in raw bytes */
NSInteger width = self.bounds.size.width, height = self.bounds.size.height;
NSUInteger dataLength = width * height * 4;
unsigned char pixelData[dataLength];
[data getBytes:pixelData length:dataLength]; // <---- EXC_BAD_ACCESS here.
/* Create a texture to render using pixel data */
GLuint imageTexture;
glGenTextures(1, &imageTexture); // <---- EXC_BAD_ACCESS occurs here if the [data getBytes:length:] line is commented out.
glBindTexture(GL_TEXTURE_2D, imageTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Destination coords.
GLfloat retainedVertices[] = {
0.0, 0.0,
width, 0.0,
0.0, height,
width, height,
};
// Source coords.
GLfloat retainedTexCoords[] = {
0.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0
};
glColor4f(1.0, 1.0, 1.0, 1.0);
glBindTexture(GL_TEXTURE_2D, imageTexture);
glVertexPointer(2, GL_FLOAT, 0, retainedVertices);
glTexCoordPointer(2, GL_FLOAT, 0, retainedTexCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
[renderer renderSceneWithScratch:NO];
[renderer presentScene];
}
}
이 모든 시뮬레이터에 절대적으로 잘 작동한다는 것입니다 : 여기
버그의 원인이되는 코드입니다. 또한, 나는이 정확한 코드가 몇 시간 일찍 장치에서 실제로 작동했다고 확신한다. 아마도 나는 화가 나있다.가 나는 행운으로 다음과 같은 시도 :
- 는 pixelData 배열이있는 NSData 객체에서 모든 바이트 를 저장하기에 충분히 큰 것을 검사하였습니다.
- 장치를 다시 시작한 후 Xcode (버전 4)을 다시 시작하고 빌드를 완료하고 핵심 데이터 모델 을 지우고 다시 빌드합니다.
- NSData 객체를 호출 할 때 이 올바르게 유지되도록합니다.
- 점차적으로 주석 처리 된 행은
코드입니다. 각 행에 대해 내가 주석으로 처리하는 경우
EXC_BAD_ACCESS 오류
이 더 아래로 이동합니다. 즉, 오류가
다른 문자에서 돌아 오는 것일 수 있습니다.
스레드입니까?
이 것은 정말 나를 괴롭 히고 있습니다. 가장 귀찮은 것은 시뮬레이터에서 모든 것이 잘 작동하는 이유입니다. 나는 이것에 대한 어떤 도움도 크게 감사 할 것입니다! 당신은 스택에 pixelData
를 할당
#0 0x36cc6c92 in objc_msgSend()
#1 0x0001e71c in -[EAGLView drawDrawingFromData:] (self=0x14dbf0, _cmd=0x4e16f, data=0x13dbd0) at /Users/Stu/Documents/...
#2 0x0001df30 in -[EAGLView layoutSubviews] (self=0x14dbf0, _cmd=0x329644ac) at /Users/Stu/Documents/...
#3 0x326675fa in -[UIView(CALayerDelegate) layoutSublayersOfLayer:]()
#4 0x35ee2f02 in -[NSObject(NSObject) performSelector:withObject:]()
#5 0x333e2bb4 in -[CALayer layoutSublayers]()
#6 0x333e296c in CALayerLayoutIfNeeded()
#7 0x333e81c4 in CA::Context::commit_transaction()
#8 0x333e7fd6 in CA::Transaction::commit()
#9 0x333e1054 in CA::Transaction::observer_callback()
#10 0x35f4ca34 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__()
#11 0x35f4e464 in __CFRunLoopDoObservers()
#12 0x35f4f75a in __CFRunLoopRun()
#13 0x35edfec2 in CFRunLoopRunSpecific()
#14 0x35edfdca in CFRunLoopRunInMode()
#15 0x3253c41e in GSEventRunModal()
#16 0x3253c4ca in GSEventRun()
#17 0x32690d68 in -[UIApplication _run]()
#18 0x3268e806 in UIApplicationMain()
#19 0x000023a0 in main (argc=1, argv=0x2fdff540) at /Users/Stu/Documents/...
감사
'new '가 C++의 기능이라고 생각 했나요? 어떻게 이것을 사용하여 obj-c 응용 프로그램에서 힙에 할당 할 수 있습니까? 내 무지 때문에 미안 ... – Stuart
아 - 내 질문에 대답했다고 생각합니다. 나는 이것이 C에서'malloc'과 같은 것이라고 가정하고있다. 나는 다음의 코드를 사용하여 데이터를 할당했다 :'unsigned char * pixelData = (unsigned char *) malloc (dataLength * sizeof (unsigned char))' , 그리고 문제를 해결 한 것 같습니다. 통찰력 덕분입니다. – Stuart
@StuDev : XCode를 사용하면 기능이 필요한 경우 C++과 Obj-C를'.mm 'Obj-C++ 파일에 혼합 할 수 있습니다. 또한, 함수의 끝에서'free (pixelData)'를 잊어 버리지 마라. 더 이상 필요 없다. –