我可以closures当前未使用的UIAppFonts的文件描述符吗?

我们将很多字体与我们的iOS应用捆绑在一起,我们将它们全部放在UIAppFonts以加快载入速度。
(我们在UIWebView使用它们,比使用@font-face加载文件快得多)。

然而,这导致我偶尔会得到这样的警告:

 Mar 13 23:07:16 iPad afcd[2582] <Error>: Max open files: 78 Mar 13 23:07:17 iPad mobile_house_arrest[2584] <Error>: Max open files: 78 Mar 13 23:07:17 iPad mobile_house_arrest[2586] <Error>: Max open files: 78 Mar 13 23:07:17 iPad mobile_house_arrest[2587] <Error>: Max open files: 78 Mar 13 23:07:17 iPad mobile_house_arrest[2588] <Error>: Max open files: 78 

这也与打开文件时的I / Oexception相关。

我使用这个片段来找出泄露的文件,它看起来像iOS 保持UIAppFonts中列出的每个字体在应用程序的整个生命周期中打开的文件描述符

 File Descriptor 8 number 9 in use for: Fonts/ABeeZee-Regular.ttf File Descriptor 9 number 10 in use for: Fonts/ABeeZee-Regular.ttf File Descriptor 10 number 11 in use for: Fonts/ABeeZee-Italic.ttf File Descriptor 11 number 12 in use for: Fonts/ABeeZee-Italic.ttf File Descriptor 12 number 13 in use for: Fonts/AmaticSC-Regular.ttf File Descriptor 13 number 14 in use for: Fonts/AmaticSC-Regular.ttf File Descriptor 14 number 15 in use for: Fonts/AmaticSC-Bold.ttf File Descriptor 15 number 16 in use for: Fonts/AmaticSC-Bold.ttf File Descriptor 16 number 17 in use for: Fonts/AnonymousPro-Bold.ttf File Descriptor 17 number 18 in use for: Fonts/AnonymousPro-Bold.ttf File Descriptor 18 number 19 in use for: Fonts/AnonymousPro-Regular.ttf File Descriptor 19 number 20 in use for: Fonts/AnonymousPro-Regular.ttf 

对于我们来说,这意味着大约有一百个打开的文件描述符,但目前不超过五个的UIAppFonts正在使用。 有时会出现重复的条目。

有没有办法强行closuresUIAppFonts我目前不使用的文件描述符?

如果没有,是否有另一种方法保持本地字体可用的UIWebView而不诉诸@font-face这是慢?

如果没有,是否有另一种方法保持本地字体可用的UIWebView而不诉诸@ font-face这是慢?

原来,有。

我们通过使用CTFontManagerRegisterFontsForURL注册字体并使用CTFontManagerRegisterFontsForURL取消注册它们来解决问题。 这使得它们可以用于UIWebView ,因为您在使用font-family之前总是注册字体。

我在closures与Sprite Kit操作相关的文件描述符时遇到了麻烦,

 playSoundFileNamed: 

他们从不closures。 所以他们吃了文件描述符,直到应用程序崩溃。 我想出了办法closures他们。 我不明白为什么它不适合你的UIAppFonts。

我修改了你在问题中引用的片段。 这是我的修改版本,

 #import <sys/types.h> #import <fcntl.h> #import <errno.h> #import <sys/param.h> -(void)closeFileDescriptorsForSounds { int flags; int fd; char buf[MAXPATHLEN+1] ; int n = 1 ; for (fd = 0; fd < (int) FD_SETSIZE; fd++) { errno = 0; flags = fcntl(fd, F_GETFD, 0); if (flags == -1 && errno) { if (errno != EBADF) { return ; } else continue; } fcntl(fd , F_GETPATH, buf ) ; NSLog( @"File Descriptor %d number %d in use for: %s",fd,n , buf ) ; ++n ; // My modifications to the snippet... NSString *str = [NSString stringWithUTF8String:buf]; NSString *theFileName = [str lastPathComponent]; if ([theFileName isEqualToString:@"LoudBang.mp3"]) { NSLog(@"FD is LoudBang"); NSFileHandle *loudBangHandle = [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES]; } else if ([theFileName isEqualToString:@"QuietBang.mp3"]) { NSLog(@"FD is QuietBang"); NSFileHandle *quietBangHandle = [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES]; } } } 

我将buf转换为一个string,然后隔离文件名。 然后我将文件名与我想closures的已知文件进行比较。 当我想要closures一个文件时,代码使用以下方法在文件描述符周围创build一个NSFileHandle,

 NSFileHandle *loudBangHandle = [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES]; 

这个init特别closuresNSFileHandle的dealloc上的文件描述符(几乎是立即)。

让我们知道它是否适用于您的UIAppFonts。

Interesting Posts