2014-09-23 4 views
3

Я проверил все связанные вопросы и ответы как на Stackoverflow, так и в Интернете, но я не пришел к выводу. Я разрабатываю приложение ipad, и то, что он делает, это запрос на мой веб-сервер для загрузки PDF-файла в виде NSData и показ его в UIWebView. Проблема в том, что приложение (закрывает) segues от pdfviewer до mainviewcontroller, память не выпускается, что увеличивает время использования памяти. Он начинается с 14 МБ, а затем каждый раз, когда я перехожу к pdfviewer от основного контроллера, он складывается. Поскольку я использую arc, я не могу его освободить. Я также очищаю кеш.UIWebView не освобождает память

MainView controller.m

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if([segue.identifier isEqualToString:@"showpdf"]){ 
     PdfViewer *pdfviewer=(PdfViewer*)[segue destinationViewController]; 
     pdfviewer.ReportID=TheReportID; 
     pdfviewer.TabID=_TabID; 
    } 

} 

PdfViewer.h

@property (strong, nonatomic) IBOutlet UIWebView *MainWebView; 

PdfViewer.m

-(void)viewDidLoad 
    {  
     NSURL *url = [NSURL fileURLWithPath:filePath]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
     [_MainWebView loadRequest:request]; 
    } 

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if([segue.identifier isEqualToString:@"ShowMain5"]){ 
     MainViewController *mv=(MainViewController*)[segue destinationViewController]; 
     mv.TabID=_TabID; 
    } 

} 
-(void)dealloc{ 
    NSLog(@"test"); 
} 

я также пытался добавить UIWebView программно вместо IBOutlet, но все еще не мог» Решить проблему.

Программным (альтернативный)

@implementation PdfViewer 

    UIWebView *webview; 

    - (void)viewDidLoad 
    {  
     webview=[[UIWebView alloc]initWithFrame:CGRectMake(35, 35, 768,959)]; 
     [webview loadRequest:request]; 
     [self.view addSubview:webview]; 
    } 

При нажатии пользователем кнопки назад все, что я сделать, это вернуться к mainviewcontroller modally.All перетекает являются модальными FYI.

Как я понял, что pdfviewer не вызывает dealloc, когда он переходит к mainviewcontroller, я проверил, имел ли кто-нибудь подобную проблему с viewcontrollers раньше, и я нашел этот вопрос. UIViewController -dealloc method not called теперь я думаю, что память остается на том же уровне, но теперь она дает pdfviewer не находится в ошибке иерархии окна.

+0

как _MainWebView определен и как у него есть указатели –

+0

Я редактировал вопрос, он был определен как сильный IBoutlet, теперь он слаб.Я также попытался добавить его программно, чтобы я мог dealloc и удалить его из памяти, но он не работал. – Codette

+1

реализовать метод dealloc с NSLog в PdfViewController и посмотреть, называется ли он –

ответ

2

Для моего опыта с UIWebView [с] решением был иметь одноплодный экземпляр для него, так по крайней мере, это основной интерфейса и свойство

// MXMWebView.h 
@interface MXMWebView : NSObject <UIWebViewDelegate, UIScrollViewDelegate> { 

    } 

    + (instancetype)sharedInstance; 

    @property(nonatomic, strong) UIWebView *webView; 

и

//MXMWebView.m 
    @implementation MXMWebView 

    @synthesize webView; 
    @synthesize delegate; 

    #pragma mark - Singleton Methods 

    + (instancetype)sharedInstance { 
    static id _sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
      _sharedInstance = [[self alloc] init]; 
    }); 

    return _sharedInstance; 

}

+0

мой метод, который я только что упомянул ниже, ограничивает использование uiwebview, но он не уменьшает использование памяти после 25mb.Нормально, когда программа запускается, она использует 15mb, а затем, когда я открываю контроллер pdfviewer, он переходит в 25 мб, а затем остается между 25 и 32 миллибар Ваш метод может работать лучше, я скажу результаты после того, как я его протещу. Спасибо. – Codette

+1

Я думаю, что это может улучшить производительность, учитывая, что у моего приложения есть 3 UIWebView, который всегда работает как singleton, с предварительно загруженным html и javascript (сразу после запуска приложения я предварительно загружаю все который должен быть в HTML, например, на странице javascript, css и т. д. – loretoparisi

+0

и сколько дополнительного использования в барах это делает, скажем, вы загружаете PDF с 1.4mb, а затем удаляете его? Я не знаю, где я его читал, Я думаю, что javascript и другие двигатели, чтобы показать pdf, занимают большую часть памяти, чтобы показать его, а затем они не освобождаются, даже если вы закрываете wievcontroller. – Codette

0

Набор WebView делегатом ноль, а перетекает от PdfViewer до mainviewcontroller

[_MainWebView setDelegate:nil]; 

--- редактировать

[_MainWebView removeFromSuperView]; 
+2

бесполезно, я боюсь. делегат не силен, и поэтому не будет цикла сохранения _here_. если бы он был сильным, вы были бы правы –

+0

это не сработает. Я уже пробовал. – Codette

+1

Что заставляет вас думать, что настройка делегата на нуль поможет? – Popeye

1

Как я понял, что PdfViewer не называет dealloc, когда он перетекает обратно в mainviewcontroller. Я проверил, имел ли кто-нибудь аналогичную проблему с viewcontrollers раньше, и я нашел этот вопрос UIViewController -dealloc method not called. Поэтому я добавил

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    self.view.window.rootViewController=self; 
} 

к обоим mainviewcontroller.m и pdfviewer.m, а также

-(void)dealloc{ 

    [_MainWebView loadHTMLString:@"" baseURL:nil]; 
    [_MainWebView stopLoading]; 
    [_MainWebView setDelegate:nil]; 
    [_MainWebView removeFromSuperview]; 

    [[NSURLCache sharedURLCache]removeAllCachedResponses]; 
    [[NSURLCache sharedURLCache] setDiskCapacity:0]; 
    [[NSURLCache sharedURLCache] setMemoryCapacity:0]; 

} 

метод для pdfViewer.m и решена problem.thanks всех за их вклад.

+0

self.view.window.rootViewController = self; ??? –

+0

Когда я открываю Pdfviewer из mainviewcontroller, он загружает представление в память, и когда я перехожу обратно в mainviewcontroller, он не делает dealloc pdfviewer, потому что это не rootviewcontroller. Я думаю, что я должен добавить информацию о том, что я не использую навигационный контроллер, поэтому я просто перехожу с одного диспетчера представлений на другой, не очищая ничего. Я думаю, что это была проблема. Знать, что использование памяти не пропускает 30 мб. Но я не уверен, есть ли у этого метода какие-то недостатки, поэтому я еще не закрываю вопрос. – Codette

Смежные вопросы