UIWebviewにてPDFを立て続けに読み込ませるとアプリが落ちる現象。(Air2のみ)
//ソース
//ここまでソース
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ViewController.m | |
// PDFViewer | |
// | |
// | |
#import "ViewController.h" | |
@interface ViewController () | |
@property (weak, nonatomic) IBOutlet UILabel *Label; | |
@end | |
UIWebView *web; | |
NSTimer *tim; | |
int Rmw = 0; | |
@implementation ViewController | |
- (void)viewDidLoad { | |
[super viewDidLoad]; | |
// Do any additional setup after loading the view, typically from a nib. | |
web = [[UIWebView alloc] initWithFrame:self.view.frame]; | |
[self.view addSubview:web]; | |
NSURL *URL = [NSURL URLWithString:@"http://mazur.me/SwiftInFlux/docs/6.3-beta1.pdf"]; | |
NSURLRequest *URLreq = [NSURLRequest requestWithURL:URL]; | |
[web loadRequest:URLreq]; | |
[self.view sendSubviewToBack:web]; | |
web.dataDetectorTypes = UIDataDetectorTypeNone; | |
tim = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(reloadpdf) userInfo:nil repeats:YES]; | |
} | |
- (IBAction)stop:(UIButton*)sender { | |
if([tim isValid]){ | |
[tim invalidate]; | |
[sender setTitle:@"START" forState:UIControlStateNormal]; | |
}else{ | |
tim = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(reloadpdf) userInfo:nil repeats:YES]; | |
[sender setTitle:@"STOP" forState:UIControlStateNormal]; | |
} | |
} | |
-(void)reloadpdf{ | |
NSURL *URL = [NSURL URLWithString:@"http://mazur.me/SwiftInFlux/docs/6.3-beta1.pdf"]; | |
NSURLRequest *URLreq = [NSURLRequest requestWithURL:URL]; | |
[web loadRequest:URLreq]; | |
} | |
- (void)didReceiveMemoryWarning { | |
[super didReceiveMemoryWarning]; | |
Rmw ++; | |
_Label.text = [NSString stringWithFormat:@"Received memory warning. %d",Rmw]; | |
// Dispose of any resources that can be recreated. | |
} | |
@end |
ソースの簡単な説明
1.起動時にWebviewを生成
2.Webviewを画面いっぱいに広げる
3.http://mazur.me/SwiftInFlux/docs/6.3-beta1.pdfを読み込ませる。
4.1.5秒間隔でタイマー発動
5. →同じPDFを再度読み込ませてる(1.5秒間隔でループ)
その他memorywarning受けるとカウントアップしてラベルに表示するようにしてます。
Air2はiOS8.1 8.2 8.3で確認
実行結果1(Air2)
実行後どんどんメモリ使用量が上がっていく
実メモリの半分あたりでmemorywarning発生(35回くらい)
なぜかゆるやかにメモリ使用量が減ってく(←謎)
MAX使用量の半分あたりでフリーズ(か落ちる)
実行結果2(Air2)
実行後どんどんメモリ使用量が上がっていく
実メモリの半分あたりでmemorywarning発生(35回くらい)
フリーズ(か落ちる)
実行結果3(Air iOS8.1.3、iPad4 iOS 8.1)
実行後どんどんメモリ使用量が上がっていく
実メモリの半分あたりでmemorywarning発生(1回のみ)
一気に起動直後くらいのメモリ使用量まで減る
その後何故か増えていかない(うまい具合に開放してる?)
共通してどれも起動後はメモリ使用量が増えていくこと。
なんなんでしょうねコレ
ローカル上のPDFでも同じでした。
ソースに記載してあるPDFだとファイルサイズ小さいのでメモリ使いきるまでちょっと時間かかるかも。
自分はWin7のピクチャーに最初から入ってたペンギンの画像をPDF化して使いました。
Webviewの使い方間違ってるのかな・・・?
でもURLにPDF指定すればいいだけだよね・・・????
ん~困ったなぁ・・・・
追記
追記
WKWebviewだと一時間で1MB※くらい増えてく
→UIWebviewよりだいぶマシ
デメリット
WKWebViewだとiOS8からとなる
ローカルファイルが開けない
→tmpにコピーすればいけるけどめんどくさいし開けててもエラー吐く
→めんどくさいしググってもよくわからないエラー吐くから気持ち悪い
→tmpにすでに同名のファイルがあるとコピー時にエラー?吐く
→これもまためんどくさい。tmp内全部削除すりゃいいけど
メリット
メモリリークがいつ発生するのかビクビクしなくて良くなる。
※1.6MBのPDFの場合
コメント
コメントを投稿