ios - iOS 打开的文件太多

标签 ios xcode uiimageview uiimage

我是 ios 编程的新手,当我的应用程序运行时,我遇到了这些错误。我正在我的应用程序中加载 950 多张图像,并且我正在使用 ARC。

ImageIO: CGImageRead_mapData 'open' failed '/Users/apple/Library/Application Support/iPhone Simulator/6.1/Applications/16551664-4694-4742-85DC-2C3C0ADC5289/demo.app/menu-24-20.png'error = 24 (Too many open files)

ImageIO: CGImageRead_mapData 'open' failed '/Users/apple/Library/Application Support/iPhone Simulator/6.1/Applications/16551664-4694-4742-85DC-2C3C0ADC5289/demo.app/menu-24-20.png'error = 24 (Too many open files)

ImageIO: CGImageRead_mapData 'open' failed '/Users/apple/Library/Application Support/iPhone Simulator/6.1/Applications/16551664-4694-4742-85DC-2C3C0ADC5289/demo.app/circle_green.png' error = 24 (Too many open files)

ImageIO: CGImageRead_mapData 'open' failed '/Users/apple/Library/Application Support/iPhone Simulator/6.1/Applications/16551664-4694-4742-85DC-2C3C0ADC5289/demo.app/circle_green.png' error = 24 (Too many open files)

ImageIO: CGImageRead_mapData 'open' failed '/Users/apple/Library/Application Support/iPhone Simulator/6.1/Applications/16551664-4694-4742-85DC-2C3C0ADC5289/demo.app/shopping_cart_1-512.png' error = 24 (Too many open files)

ImageIO: CGImageRead_mapData 'open' failed '/Users/apple/Library/Application Support/iPhone Simulator/6.1/Applications/16551664-4694-4742-85DC-2C3C0ADC5289/demo.app/shopping_cart_1-512.png' error = 24 (Too many open files)



此代码块是我的应用程序的一部分。
                while(sqlite3_step(compiledStatement) == SQLITE_ROW)  {
                    int UrunId = sqlite3_column_int(compiledStatement,0);
                    //NSString *urunNo= [NSString stringWithFormat:@"%i",UrunId];
                    UrunAdi = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 1)];
                    NSString *imageName= [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 2)];
                    UIImageView *background = [[UIImageView alloc]initWithFrame:CGRectMake(column*197+30, row*350, 175, 280)];

                    NSString *filePathBackGround = [[NSBundle mainBundle] pathForResource:@"BackImage" ofType:@"png"];
                    NSData *myData = [NSData dataWithContentsOfFile:filePathBackGround];                        
                    UIImage *blackBackGround = [UIImage imageWithData:myData];

                    [background setImage:blackBackGround];                                            
                    [scrollView addSubview:background];



                    NSString *filePathSepeteEkleButton = [[NSBundle mainBundle] pathForResource:@"sepeteEkleButtonImage" ofType:@"png"];
                    NSData *myDataButton = [NSData dataWithContentsOfFile:filePathSepeteEkleButton];

                    UIImage *sepeteEkleButtonImage = [UIImage imageWithData:myDataButton];
                    UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
                    [button setFrame:CGRectMake(column*197+38 , row*350+8, 159, 45)];
                    [button setImage:sepeteEkleButtonImage forState:UIControlStateNormal];
                    [button addTarget:self
                               action:@selector(addToChart:)
                     forControlEvents:UIControlEventTouchUpInside];
                    button.tag = UrunId;



                    UILabel *buttonLabel=[[UILabel alloc]initWithFrame:CGRectMake(column*197+43,row*350+20,200,20)];
                    buttonLabel.textColor = [UIColor whiteColor];
                    buttonLabel.backgroundColor=[UIColor clearColor];
                    buttonLabel.text=UrunAdi;

                    [scrollView addSubview:button];

                    [scrollView addSubview:buttonLabel];


                    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                    NSString *documentsPath = [paths objectAtIndex:0]; //Get the docs directory
                    NSString *filePath = [documentsPath stringByAppendingPathComponent:imageName];

                    NSData *pngData = [NSData dataWithContentsOfFile:filePath];
                    if (pngData == nil) {
                        NSString *filePathResimYok= [[NSBundle mainBundle] pathForResource:@"resimYok" ofType:@"jpeg"];
                        NSData *myDataResimYok= [NSData dataWithContentsOfFile:filePathResimYok];
                        image2 = [UIImage imageWithData:myDataResimYok];//horoda
                    }else{
                        image2 = [UIImage imageWithData:pngData];
                    }
                    image2=[image2 imageByScalingAndCroppingForSize:CGSizeMake(175, 210)];

                    //UIImage *urunDetayImage = [UIImage imageNamed:image2];
                    UIButton * urunDetayButton = [UIButton buttonWithType:UIButtonTypeCustom];
                    [urunDetayButton setFrame:CGRectMake(column*197+38 , row*350+58, 159, 170)];
                    [urunDetayButton setImage:image2 forState:UIControlStateNormal];
                    [urunDetayButton addTarget:self
                                        action:@selector(buttonClicked:)
                              forControlEvents:UIControlEventTouchUpInside];
                    urunDetayButton.tag = UrunId;
                    [scrollView addSubview:urunDetayButton];

                    UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(column*197+38,row*350+245,200,20)];
                    label.textColor = [UIColor whiteColor];
                    label.backgroundColor=[UIColor clearColor];
                    label.text=UrunAdi;
                    [scrollView addSubview:label];

我正在尝试修复 3 天。请帮助我。谢谢。

最佳答案

据我所见,您的代码看起来不错,并且在模拟器中运行(内存充足)应该可以正常工作。几点建议:

1) 使用dataWithContentsOfFile:options:error:而不是 dataWithContentsOfFile: ,使用 NSDataReadingUncached 选项(以减少系统的内存压力),并测试返回值 - 如果 nil 记录错误并更新您的问题。

2)你总是可以将数据图像转储到一个 NSCache 对象中,如果系统需要内存,它会释放缓存项,你必须从文件系统中重新读取图像。即使您一次只提取几个图像,您也可以使用此技术。

3) 你可以使用 UIImage imageWithContentsOfFile:而不是获取数据然后创建图像。在这种情况下,将 UIImage 本身放入缓存中,并带有其名称的键。

关于ios - iOS 打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16338608/

相关文章:

javascript - 无法在iPhone上更改youtube电影的质量

objective-c - 带有 UIImageView 的 UIView 更大

ios - SwiftUI : API URL fetch failed

ios - iOS UIImage 上的棱镜效果

ios - Swift:在不改变大小的情况下绘制图像(纵横比填充)

iOS 添加按钮到 WidgetKit 扩展

ios - 在没有私有(private) API 的情况下在 iOS 中获取光传感器值?

ios - 快速更改 UISlider 的高度

iphone - UIImageView 和 UIScrollView 加载大量图片

iPhone开发-TableView属性