2011-12-22 11 views
0

여기 상황이 있습니다.응용 프로그램이 실제 장치에서 작동하지 않습니다.

기기 : ipod 터치 3 세대. iOS 4.1 OS X : Lion

매우 간단한 App, ViewController입니다. 여기에 UIImageView와 UIButton이 있습니다. 버튼을 클릭하면 컴퓨팅이 수행되고 이미지가 생성되어 UIImageView에로드됩니다. 일반적으로 버튼을 클릭하면 click 이벤트에서 작동하는 일부 이미지 처리가 수행됩니다.

이 응용 프로그램은 시뮬레이터에서 잘 작동합니다. 단추를 클릭하면 UIImageView에 그림이 올바르게 표시됩니다. 그것은 1 ~ 2 초 정도의 시간이 걸리므로 그리 오래 걸리지 않습니다.

내 iPod 터치를 내 MBP에 연결하고 Xcode에서로드하십시오. 내 코드에서 하나의 for 루프에 몇 가지 중단 점을 설정했습니다 (클릭 이벤트에서). 이상한 일들이 있습니다.

for 루프 연산의 대부분을 메인 루프이다. 처음에는 중단 점에서 멈추고 i는 0 i=0입니다. 내가 앱을 계속하면 앱이 멈춘 것처럼 보이고, 잠시 기다려야합니다. 그러면 i는 1이 아닌 올바른 번호가 4 또는 8 또는 9가됩니다.

나는 컴퓨팅 작업을 UI 스레드가 아닌 다른 스레드에 넣으면 의심 스럽다. 도움이 되나요? 실제로 click 이벤트에는 이상한 코드가 하나도 없지만 정확한 이미지를 얻을 수는 없으며 검정색 이미지 만 얻을 수 있습니다. 누구나 전에 만나거나 제안을 해주십시오.

UPDATE 여기

버튼 클릭 이벤트 일 것입니다.

int width=320; 
    int height=480; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    void *imageData = malloc(height * width * 4); 
    CGContextRef contextRef = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    //CGColorSpaceRelease(colorSpace); 
    CGContextClearRect(contextRef, CGRectMake(0, 0, width, height)); 
    CGContextTranslateCTM(contextRef, 0, height - height); 

    for(int i=0;i<height;i++) 
    { 
     for (int j=0; j<width; j++) { 
      *((char *)(imageData+i*width*4+j*4))=0; 
      *((char *)(imageData+i*width*4+j*4+1))=0; 
      *((char *)(imageData+i*width*4+j*4+2))=0; 
      *((char *)(imageData+i*width*4+j*4+3))=255; 
     } 
    } 

    int xmin=-2; 
    int xmax=2; 
    int ymin=-2; 
    int ymax=2; 

    int fre[320 * 480]={0}; 

    CGPoint p=CGPointZero; 

    float x=arc4random()*1.0/ARC4RANDOM_MAX; 
    float y=arc4random()*1.0/ARC4RANDOM_MAX; 

    p.x=x*(xmax-xmin)+xmin; 
    p.y=y*(ymax-ymin)+ymin; 

    int MIN_ITERATE=10; 
    int ite_from_start=0; 

    DataPoint point; 
    point.p=p; 
    point.red=0.0; 
    point.green=0.0; 
    point.blue=0.0; 

    IFSFunctions *ifsfunction=[[IFSFunctions alloc] init]; 

    for (int i=0; i<1000000; i++) { 
     if(p.x<=160 && p.x >=-160 && p.y <= 240 && p.y >= -240) 
     { 
      //fre[((int)p.y+240)*320+(int)p.x+160]++; 
       point=[ifsfunction caculate:point]; 

      int data_x=(int)(320*(point.p.x-xmin)/(xmax-xmin)); 
      int data_y=(int)(480*(point.p.y-ymin)/(ymax-ymin)); 

      if(data_x >=0 && data_x<320 && data_y >=0 && data_y < 480 && ite_from_start < 20000) 
      { 
       ite_from_start++; 
       if(ite_from_start > MIN_ITERATE) 
       { 
        *((char *)(imageData+data_y*width*4+data_x*4))=(int)point.red; 
        *((char *)(imageData+data_y*width*4+data_x*4+1))=(int)point.green; 
        *((char *)(imageData+data_y*width*4+data_x*4+2))=(int)point.blue;; 
       } 
       fre[data_y*width+data_x]++; 
      } 
      else 
      { 
       ite_from_start=0; 
       point=[ifsfunction caculate:point]; 
      } 
     } 
    } 

    int max_int=0; 
    for (int i=0; i<320*480; i++) { 
     if (fre[i]>max_int) { 
      max_int=fre[i]; 
     } 
    } 
    //NSLog([NSString stringWithFormat:@"The max interation %f",logf(max_int+1)]); 
    for (int i=0; i<height; i++) { 
     for(int j=0;j<width;j++){ 
      float intensity=logf(fre[i*width+j]+1.0)/logf(max_int/300+1); 
      //NSLog([NSString stringWithFormat:@"The %f",intensity]); 
      float gamma=powf(intensity, 0.25); 
      *((char *)(imageData+i*width*4+j*4))=(int)(gamma*(*((char *)(imageData+i*width*4+j*4)))); 
      *((char *)(imageData+i*width*4+j*4+1))=(int)(gamma*(*((char *)(imageData+i*width*4+j*4+1)))); 
      *((char *)(imageData+i*width*4+j*4+2))=(int)(gamma*(*((char *)(imageData+i*width*4+j*4+2)))); 
     } 
    } 

    CGDataProviderRef dataProvider=CGDataProviderCreateWithData(NULL, imageData, height * width * 4, NULL); 
    CGImageRef imageRef=CGImageCreate(width, height, 8, 32, 4*width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big, dataProvider, NULL, NO, kCGRenderingIntentDefault); 

    CGColorSpaceRelease(colorSpace); 
    CGDataProviderRelease(dataProvider); 
    CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef); 

    imgView.image=[UIImage imageWithCGImage:imageRef]; 

    CGImageRelease(imageRef); 
    CGContextRelease(contextRef); 
    free(imageData); 

최고 감사합니다,

+0

루프 코드를 알려주십시오. 또한 오류 메시지가 있으면 오류 메시지의 내용을 알려주십시오. – sosborn

+0

오류 메시지가 없습니다. 코드를 표시하고 싶지만, 모두 표시하기가 어렵습니다. –

+0

그러면 도움이되지 않습니다. 코드를 볼 수 없다면 어떻게되는지 알 수 있습니까? – sosborn

답변

0

는 시뮬레이터에 1 ~ 2 초 걸린다면, 그것은 장치에 더 많이 소요됩니다. 실제로 시뮬레이터는 Mac의 iOS API입니다. NSOperation을 만들고 분리 된 스레드에서 실행합니다. for 루프가 다음과 같이 표시되는지 확인하십시오.

for(int i = 0; i < YOURNUMBERHERE; i++) 
+0

아마도 1 초도 안되는 것 같습니다. 다른 스레드에서 실행되면이 문제가 해결 될 수 있습니까? –

+0

다른 스레드에서 실행해도 문제가 해결되지 않습니다. 여전히 실패하지만 다른 스레드에서 실패 할 것입니다. – sosborn

+2

제 아이디어는 메인 스레드를 차단하지 않는 것입니다. –

관련 문제