我们将大量字体与我们的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 / O异常相关。
我使用this snippet查找泄漏的文件,看起来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
不超过五个。有时会出现重复的条目。
有没有强行关闭UIAppFonts
目前我没有使用的文件描述符?
如果没有,是否有另一种方法可以让UIWebView
无法使用本地字体而不诉诸@font-face
哪个很慢?
答案 0 :(得分:2)
如果没有,是否有另一种方法可以保持UIWebView可以使用本地字体,而不需要使用慢速的@ font-face?
原来,有。
我们通过使用CTFontManagerRegisterFontsForURL
注册字体并使用CTFontManagerUnregisterFontsForURL
取消注册来解决问题。这使得UIWebView
可以使用它们,因为您始终在font-family
中使用字体之前注册字体。
答案 1 :(得分:1)
我在关闭与Sprite Kit操作相关联的文件描述符时遇到了麻烦,
playSoundFileNamed:
他们永远不会关闭。所以他们会吃掉文件描述符,直到应用程序崩溃。我想出了一种方法来关闭它们。我不明白为什么它对你的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转换为字符串然后隔离了文件名。然后我将文件名与我想要关闭的已知文件进行了比较。当找到我要关闭的文件时,代码使用以下内容在文件描述符周围创建一个NSFileHandle,
NSFileHandle *loudBangHandle = [[NSFileHandle alloc] initWithFileDescriptor:fd closeOnDealloc:YES];
此init专门关闭NSFileHandle的dealloc上的文件描述符(几乎是立即)。
告诉我们它是否适用于您的UIAppFonts。