2014-09-23 4 views
3

Stackoverflow와 인터넷에서 관련된 질문과 대답을 모두 확인했지만 결론은 없습니다. ipad 앱을 개발하고 있는데, NSData로 웹 서버에 PDF 파일을 다운로드하고 UIWebView에 표시하는 기능을 요청합니다. 문제는 pdfviewer에서 mainviewcontroller로 앱이 닫히고 메모리가 해제되지 않아서 항상 메모리 사용량이 증가하더라도 문제입니다. 그것은 14 메가 바이트로 시작하고 그때마다 나는 주 컨트롤러에서 pdfviewer까지 추가합니다. 나는 호를 사용하고 있기 때문에 그것을 놓을 수 없다. 나는 또한 캐시를 지우고있다.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; 

나는 또한있는 UIWebView 프로그램 대신 함께 IBOutlet을 추가하려고하지만 여전히 '나오지 않았어

-(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"); 
} 

PdfViewer.m 문제를 해결하지 마라.

프로그래밍 사용자를 눌러 뒤로 버튼 내가하는 모든 일이 modally.All의 segues은 참고 모달 mainviewcontroller로 돌아가입니다 (대체)

@implementation PdfViewer 

    UIWebView *webview; 

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

.

내가 그 사람이 전에 viewcontrollers와 유사한 문제를했고 내가 메모리가 동일한 수준으로 유지 생각 지금이 질문 UIViewController -dealloc method not called을 발견하면 내가 확인 mainviewcontroller 다시 segues 때 pdfviewer이 할당 해제를 호출하지 않습니다 알 수있는 바와 같이,하지만 지금은 pdfviewer을 제공합니다 창 계층 구조 오류가 아닙니다.

+0

어떻게 _MainWebView가 정의되었고 그것에 대한 포인터가 있습니까? –

+0

질문을 편집했습니다. 강한 IBoutlet으로 정의되었습니다. 이제는 약합니다.또한 dealloc 수 및 메모리에서 제거 할 수 있도록 프로그래밍 방식으로 추가하려고했지만 작동하지 않았다. – Codette

+1

은 PdfViewController에서 NSLog를 사용하여 dealloc 메소드를 구현하고 –

답변

2

그래서 적어도 기본적인 인터페이스와 속성, 그것을 위해 싱글 인스턴스를 가지고 있었다

// 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를 사용하고 25MB로 이동하면 pdfviewer 컨트롤러를 열면 25MB와 32 사이에 유지됩니다. mb. 귀하의 방법은 더 잘 작동 할 수 있습니다, 내가 테스트 후 결과를 말할 것입니다. 감사합니다 – Codette

+1

내 응용 프로그램이 3 UIWebView 항상 HTML과 자바 스크립트 미리로드 된 (그냥 응용 프로그램 시작 후 모든 preloaded 그게 자바 스크립트, CSS 등 – loretoparisi

+0

과 같은 HTML에 있어야합니다 얼마나 여분의 RAM 사용 후, 말, 당신은 1.4mb와 PDF를로드하고 다음을 제거합니까? 나는 그것을 읽었지만 모르겠지만 내가 자바 스크립트 및 기타 엔진을 보여줄 수있는 대부분의 메모리를 보여줍니다 생각하고 wievcontroller 닫을 경우 deallocated 경우. – Codette

0

설정 웹보기 ​​전무에 위임 pdfviewer에서 segues가 mainviewcontroller하는 동안

[_MainWebView setDelegate:nil]; 

--- 편집

[_MainWebView removeFromSuperView]; 
+2

쓸모없는 나를 두려워했다. 대의원은 강하게지지되지 않으므로 보존주기가 없을 것입니다. 그것이 강했다면 당신은 맞을 것입니다 –

+0

이것은 작동하지 않습니다 .i 이미 시도했습니다. – Codette

+1

대리자를 nil로 설정하면 도움이 될 것이라고 생각되는 이유는 무엇입니까? – Popeye

1

내가 그것을 mainviewcontroller 다시 segues 때 pdfviewer이 할당 해제를 호출하지 않습니다 알 수있는 바와 같이. 전에 누구든지 viewcontrollers와 비슷한 문제가 있었는지 확인하고 난이 질문을 발견 UIViewController -dealloc method not called. 그래서 나는 pdfViewer.m에 모두 mainviewcontroller.m 및 pdfviewer.m에

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

또한

-(void)dealloc{ 

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

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

} 

방법을 추가하고 그들의 기여에 대한 problem.Thanks 모두를 해결했다. 있는 UIWebView [S] 솔루션과 내 경험을 위해

+0

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

+0

내가 mainviewcontroller에서 Pdfviewer를 열면 메모리에 뷰가로드되고 mainviewcontroller로 다시 segue 할 때 pdfviewer가 dealloc되지 않습니다. 왜냐하면 이것이 rootviewcontroller가 아니기 때문입니다. 나는 내가 navigationcontroller를 사용하지 않는다는 정보를 추가해야한다고 생각한다. 그래서 나는 어떤 viewcontroller에서 다른 것을 지우지 않고 다른 viewcontroller로 향하게한다. 나는 그것이 문제라고 생각한다. 메모리 사용량은 전혀 30MB를 통과하지 못한다. 그러나이 방법에는 단점이 있는지 확실하지 않아서 아직 질문을 닫지 않을 것이다. – Codette

관련 문제