我可以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。