应用程序无法在真实设备上运行

时间:2011-12-22 01:37:13

标签: iphone ios

情况就是这样。

设备:ipod Touch第3代。 iOS 4.1 OS X:Lion

这是一个非常简单的App,一个ViewController,上面有一个UIImageView和一个UIButton。单击按钮时,它会进行一些计算,生成图像并将其加载到UIImageView。一般来说,当您单击按钮时,它会在单击事件中进行一些图像处理。

此应用程序在模拟器上运行良好。单击按钮时,它会在UIImageView上正确显示图片。它花费大约1~2秒,不会太久。

我将我的ipod touch连接到我的MBP,并从Xcode加载它。我在代码中的一个for循环中设置了一些断点(在单击事件中)。有一些奇怪的事情。

这个for循环是完成大部分计算的主循环。它会先停在断点处,i为0 i=0;当我继续应用程序时,应用程序似乎停止,您需要等待一段时间,然后i变为4或8或9,而不是正确的数字1

我怀疑,如果我将计算工作放在另一个线程中,而不是在UI线程中。有帮助吗?实际上,点击事件中没有任何奇怪的代码,但是,我无法获得正确的图像,只有黑色图像。有没有人以前见过它,或者请提出你的建议。

更新

以下是按钮点击事件的作用。

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);

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

如果在模拟器上花费1~2秒,设备上将需要更多时间。实际上,模拟器只是Mac上的iOS API。我创建了一个NSOperation并在一个独立的线程上执行它。并确保你的for循环看起来像这样:

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