ImageIO: CGImageRead_mapData 'open' fail error = 24 (Слишком много открытых файлов) - PullRequest
0 голосов
/ 10 октября 2011

Я занимаюсь разработкой небольшого игрового приложения, используя Uikit + Uiimages. В нормальном состоянии мое приложение работает без проблем. но когда я использую опрометчиво, он вылетит с ошибкой

<Notice>: ImageIO: CGImageRead_mapData 'open' failed '/var/mobile/Applications/01E69C96-CF79-466F-93AB-3A6752AF1295/PictureBook.app/NextPage.png'

<Notice>: error = 24 (Too many open files).

Я освобождаю все изображения и видео после завершения использования. Я проверил мое приложение с утечкой. Также нет утечек. Нет предупреждений, нет потенциальных утечек и т. Д. *

Я искал хороший ответ, но пока не получил соответствующего ответа. Кто-нибудь знает ответ, пожалуйста, ответьте. Я разместил некоторые коды ниже.

- (NSMutableArray *)flowerArray {

if (!_flowerArray) {

_flowerArray = [[NSMutableArray alloc]init];

for (int i = 1; i <= 5; i++) {

UIImage *flowerIm = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"01_Flower_0%d.png",i] ofType:nil]];

[_flowerArray addObject:flowerIm];

[flowerIm release];

}

}

return _flowerArray;
}


-(void)flowerImagesAnimate {

self.flowerImage.animationImages = self.flowerArray;

self.flowerArray = nil;

self.flowerImage.animationDuration = 1.0;

self.flowerImage.animationRepeatCount = 3;

[self.flowerImage startAnimating];

}



-(void)playerPrepare
{

[self.view addSubview:[self.presentView playerPrepare]];

}
-(void)wakeUPPanjo
{
NSString *url = [[NSBundle mainBundle] pathForResource:@"01_Anim" 
ofType:@"mp4"];

NSURL *movieURL = [NSURL fileURLWithPath:url];



self.presentView.player = [[MPMoviePlayerController alloc] 
initWithContentURL:movieURL];




[[NSNotificationCenter defaultCenter] 
addObserver:self
selector:@selector(movieFinishedCallback 
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.presentView.player];

[self.presentView.player prepareToPlay];

[self performSelector:@selector(playerPrepare) withObject:nil afterDelay:0.5];

wakeUpTimer = nil;


}


-(void)viewLoad
{

wakeUpTimer = [NSTimer scheduledTimerWithTimeInterval:videoDelay target:self selector:@selector(wakeUPPanjo) userInfo:nil repeats:NO];

[self performSelector:@selector(flowerImagesAnimate) withObject:nil afterDelay:flowerPopupDelay];
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

[self performSelectorOnMainThread:@selector(viewLoad) 
withObject:nil 
waitUntilDone:false];
}

Ответы [ 3 ]

5 голосов
/ 10 октября 2011

Попробуйте использовать initWithContentsOfFile во всем проекте для загрузки изображений вместо imageNamed в UIImage. imageNamed автоматически высвобождается, если у вас слишком много изображений, которые могут привести к серьезным проблемам, Apple сама рекомендует сократить использование автоматически высвобождаемых объектов.

iPhone OS Примечание. Поскольку в iPhone OS приложение выполняется в среде с более ограниченным объемом памяти, использование пулов автоматического выпуска не рекомендуется в методах или блоках кода (например, циклах), когда приложение создает много объектов. Вместо этого вы должны явно освобождать объекты всякий раз, когда это возможно.

5 голосов
/ 09 апреля 2015

Произошла та же ошибка при чтении данных изображения из моего каталога кэша.

Когда ваше изображение содержится в App-Project, тогда предложение Афзала является лучшим решением.

Но при чтении его прямо из папки кэша, чем не использовать

[UIImage initWithContentsOfFile:<image-file-path>];

особенно когда вы загружаете как кучу изображений из Cache-Folder, потому что это может сломать некоторые из ваших изображений, и они могут выглядеть так, как будто некоторые загружены только наполовину. Загрузите данные изображения, как показано ниже

NSData *data = [NSData dataWithContentsOfFile:<image-file-path>];
UIImage *image = [UIImage imageWithData:data];

Это, скорее всего, не будет выглядеть поврежденным ни на одном из ваших изображений.

Полагаю, это из-за одновременного открытия множества потоков ввода.

0 голосов
/ 10 октября 2011

Пробег sudo fs_usage -f filesys PictureBook. Во втором столбце файлы должны «открываться» и «закрываться», но в вашем приложении слишком много «открыто» и слишком мало «закрыто», потому что вы открываете файлы слишком быстро или из-за утечки файловых дескрипторов. Может быть, вы не сохраняете _flowerArray, и он воссоздается каждый раз? Непонятно. Ищите файлы-нарушители и добавьте несколько журналов.

Если бы вы использовали imageNamed UIImage вместо initWithContentsOfFile, файлы кэшировались бы и использовались повторно, и это не было бы так подвержено сбоям, но в любом случае, очень вероятно, что вы просачивались / открывались слишком быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...