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

时间:2013-03-13 22:16:54

标签: ios uiwebview file-descriptor uifont 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 / 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哪个很慢?

2 个答案:

答案 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。

相关问题