2011-12-22 9 views
0

Вот ситуация.Приложение не работает на реальном устройстве

Прибор: ipod Touch 3-го поколения. iOS 4.1 OS X: Lion

Это очень простое приложение, ViewController, на нем есть UIImageView и UIButton. При нажатии кнопки он выполняет некоторые вычисления, генерирует изображение и загружает его в UIImageView. Вообще говоря, когда вы нажимаете кнопку, это будет делать некоторую обработку изображения, работающую в событии click.

Это приложение хорошо работает на тренажере. Когда вы нажмете кнопку, она правильно отобразит изображение в UIImageView. Это стоит около 1 ~ 2 секунды, не так долго.

Я подключаю свой iPod touch к своему MBP и загружаю его с Xcode. Я установил некоторые точки останова в одном цикле for в моем коде (в событии click). Есть странные вещи.

Этот цикл for является основным циклом, который выполняет большую часть вычислений. Сначала он остановится в точке разрыва, i - 0 i=0; Когда я продолжаю приложение, приложение кажется остановленным, вам нужно подождать некоторое время, тогда i станет 4 или 8 или 9, а не правильным номером 1.

Я подозреваю, что если я положу вычислительную работу в другой поток, а не в поток пользовательского интерфейса. Помогает ли это? На самом деле, нет ничего странного кода в событии 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 секунды на тренажере, это займет намного больше на устройстве. Фактически, симулятор - это всего лишь API iOS на Mac. Я бы создал NSOperation и выполнил его в отдельном потоке. И убедитесь, что ваш цикл цикла выглядит следующим образом:

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

Может быть, менее 1 секунды, это кажется быстрым. Вы имеете в виду, если он работает в другом потоке, может решить эту проблему? –

+0

Запуск в другом потоке не решит проблему. Он все равно потерпит неудачу, но он просто потерпит неудачу в другом потоке. – sosborn

+2

Моя идея - не блокировать основной поток. –

Смежные вопросы