9

Вопрос по ios5, ios, iphone – UIWebView не освобождает все живые байты с помощью ARC

Error: User Rate Limit Exceededна GitHubError: User Rate Limit Exceeded

@implementation ViewController
-(IBAction)googlePressed:(id)sender
{
   CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.google.com"];
   [self.navigationController pushViewController:customWebView animated:NO];
 }
-(IBAction)ksbwPressed:(id)sender
{
   CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.ksbw.com/news/money/Yahoo-laying-off-2-000-workers-in-latest-purge/-/1850/10207484/-/oeyufvz/-/index.html"];
   [self.navigationController pushViewController:customWebView animated:NO];
}
-(IBAction)feedProxyPressed:(id)sender
{
   CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://feedproxy.google.com/~r/spaceheadlines/~3/kbL0jv9rbsg/15159-dallas-tornadoes-satellite-image.html"];
   [self.navigationController pushViewController:customWebView animated:NO];
}
-(IBAction)cnnPressed:(id)sender
{
   CustomWebView *customWebView = [[CustomWebView alloc] initWithStringURL:@"http://www.cnn.com/2012/04/04/us/california-shooting/index.html?eref=rss_mostpopular"];
   [self.navigationController pushViewController:customWebView animated:NO];
}

Error: User Rate Limit Exceeded

@implementation CustomWebView

@synthesize webView, link;

- (id)initWithStringURL:(NSString *) stringURL
{
   if (self = [super init]) {
       link = stringURL;
   } 
   return self;
}


- (void)viewDidLoad
{
   [super viewDidLoad];
   NSURL *url = [NSURL URLWithString:link];
   NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
   [webView loadRequest:urlRequest];
}

- (void)viewDidUnload
{
   [super viewDidUnload];
}

Error: User Rate Limit Exceeded

Heapshots

Error: User Rate Limit Exceeded

РЕДАКТИРОВАТЬ:

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

  • Не уверен, как я пропустил детали ARC в вашем вопросе. Теперь я не уверен, почему это не выпускает.

    от
  • в идеале это должен быть (IBAction) googlePressed: (id) отправитель {CustomWebView * customWebView = [[CustomWebView alloc] initWithStringURL: @ & quot;google.com"]; [self.navigationController pushViewController: customWebView animated: NO]; [выпуск customWebView]; }

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от brendan
  • Я добавил этот код в свой проект, и это не решило проблему с памятью. Пример проекта, который показывает мою проблему, можно найтиgithub.com/bfruin/WebViewMemory

    от brendan
  • Веб-просмотры дороги с точки зрения потребления ресурсов. Я не уверен, почему ваши общие живые укусы не меняются. В ваших IBActions ViewController, после добавления контроллеров представления в ваш стек навигации, вы освобождаете объекты, которые вы создаете? Я пропустил эту деталь ранее.

    от
  • Ну, я быстро взглянул на ваш код на Git и ничего очевидного, но, думаю, в конечном итоге я должен сказать: в чем проблема? Вы используете ARC. Управление памятью не ваша проблема. Если вы не видите утечку, которая НЕ указана на скриншоте, который вы опубликовали, в чем на самом деле проблема? Попробуйте использовать инструмент Allocations и посмотрите, какие объекты были созданы и их количество.

    от
  • Я использую этот подход в приложении, которое помещает несколько веб-представлений в стек навигации, но это не работает. Я делаю вышеупомянутое, когда я получаю предупреждения памяти (очистка веб-представлений далее в стеке, затем воссоздание их, когда представление снова появляется), когда родительский контроллер представления удален и т. Д., Но это не работает. Прежде всего, увеличивается потребление памяти при выталкивании из стека. Кроме того, при возврате после довольно глубокой навигации, когда я уверен, что каждое веб-представление освобождается, как указано выше, приложение по-прежнему потребляет большую часть полностью выделенной памяти.

    от
  • Я пробовал только с одним указанным способом, и я получаю те же проблемы. Я разместил пример проекта на GitHub, чтобы показать мои проблемы с памятью.github.com/bfruin/WebViewMemory

    от brendan
  • Error: User Rate Limit Exceeded

    от brendan
  • codercowboy.com/code-uiwebview-memory-leak-prevention

    от
  • Error: User Rate Limit Exceeded

    от brendan
  • Error: User Rate Limit Exceeded

    от wvteijlingen
  • Error: User Rate Limit Exceeded

    от MishieMoo
6 ответов
  • 0

    google

    @interface WebViewViewController : UIViewController<UIWebViewDelegate>

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    NSString* urlAddress = @"http://www..com";
    NSURL *url = [NSURL URLWithString:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    self.webView.delegate = self;
    [self.webView loadRequest:requestObj];
    }
    
    -(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [_webView stopLoading];
    [_webView loadHTMLString:@"<html><head></head><body></body></html>" baseURL:nil];
    [_webView stopLoading];
    [_webView removeFromSuperview];
    }
    
    - (void)dealloc
    {
    [_webView stopLoading];
    }
    
    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
    {
    [_webView stopLoading];
    _webView = nil;
    }
    

  • 8

    Error: User Rate Limit Exceeded

    /*
    
     There are several theories and rumors about UIWebView memory leaks, and how
     to properly handle cleaning a UIWebView instance up before deallocation. This
     method implements several of those recommendations.
    
     #1: Various developers believe UIWebView may not properly throw away child
     objects & views without forcing the UIWebView to load empty content before
     dealloc.
    
     Source: http://stackoverflow.com/questions/648396/does-uiwebview-leak-memory
    
     */        
    [webView loadHTMLString:@"" baseURL:nil];
    
    /*
    
     #2: Others claim that UIWebView's will leak if they are loading content
     during dealloc.
    
     Source: http://stackoverflow.com/questions/6124020/uiwebview-leaking
    
     */
    [webView stopLoading];
    
    /*
    
     #3: Apple recommends setting the delegate to nil before deallocation:
     "Important: Before releasing an instance of UIWebView for which you have set
     a delegate, you must first set the UIWebView delegate property to nil before
     disposing of the UIWebView instance. This can be done, for example, in the
     dealloc method where you dispose of the UIWebView."
    
     Source: UIWebViewDelegate class reference    
    
     */
    [webView setDelegate:nil];
    
    
    /*
    
     #4: If you're creating multiple child views for any given view, and you're
     trying to deallocate an old child, that child is pointed to by the parent
     view, and won't actually deallocate until that parent view dissapears. This
     call below ensures that you are not creating many child views that will hang
     around until the parent view is deallocated.
     */
    
    [webView removeFromSuperview];
    

  • 1

    Error: User Rate Limit Exceeded

    never

  • 0

    Error: User Rate Limit Exceeded

  • 1

    Error: User Rate Limit Exceeded

    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        [self.webView loadHTMLString:@"<html></html>" baseURL:nil];
    }
    

  • 0

    Error: User Rate Limit Exceeded