2011-04-13 5 views
0

이 점이 나를 미치게합니다. 최근 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/... 

감사

답변

1

:

편집 여기

오류에서 역 추적입니다. 아마도 스택의 오버 플로우가 발생할 가능성이 있습니다. 이는 아마도 시뮬레이터가 허용하는 것보다 작을 것입니다. 대신 new을 사용하여 힙에 할당하는 것이 좋습니다.

+0

'new '가 C++의 기능이라고 생각 했나요? 어떻게 이것을 사용하여 obj-c 응용 프로그램에서 힙에 할당 할 수 있습니까? 내 무지 때문에 미안 ... – Stuart

+0

아 - 내 질문에 대답했다고 생각합니다. 나는 이것이 C에서'malloc'과 같은 것이라고 가정하고있다. 나는 다음의 코드를 사용하여 데이터를 할당했다 :'unsigned char * pixelData = (unsigned char *) malloc (dataLength * sizeof (unsigned char))' , 그리고 문제를 해결 한 것 같습니다. 통찰력 덕분입니다. – Stuart

+0

@StuDev : XCode를 사용하면 기능이 필요한 경우 C++과 Obj-C를'.mm 'Obj-C++ 파일에 혼합 할 수 있습니다. 또한, 함수의 끝에서'free (pixelData)'를 잊어 버리지 마라. 더 이상 필요 없다. –

관련 문제