2013-03-13 92 views
3

我們將很多字體與我們的iOS應用程序捆綁在一起,我們將它們全部放在UIAppFonts中,以加快載入速度。
(我們在UIWebView之內使用它們,它的比使用@font-face加載文件要快得多)。我可以關閉當前未使用的UIAppFonts的文件描述符嗎?

然而,這導致我偶爾會得到這樣的警告:

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

如果沒有,是否有另一種方法保持本地字體可用於UIWebView而不訴諸@ font-face這是慢?

原來,有。

我們通過註冊字體使用CTFontManagerRegisterFontsForURLCTFontManagerUnregisterFontsForURL註銷他們解決了這個問題。這使它們可用於UIWebView,因爲您在使用font-family之前總是註冊字體。

+0

現在在帶有120多種自定義字體的應用程序中遇到此問題。不使用UIWebView,只是自定義的UILabels ...猜猜是時候減少字體列表... – 2014-07-11 11:42:08

+1

@Brad:我認爲這種方法也適用於UILabels。 (除非您需要一次顯示所有120個以上) – 2014-07-11 12:20:21

1

我在和一個雪碧套件動作相關收盤文件描述符麻煩,

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。

相關問題