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

9

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

Error: User Rate Limit Exceeded wvteijlingen
Error: User Rate Limit Exceeded MishieMoo
Error: User Rate Limit Exceeded brendan

Ваш Ответ

6   ответов
8

Error: User Rate Limit ExceededError: 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

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

Error: User Rate Limit Exceeded

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

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Веб-просмотры дороги с точки зрения потребления ресурсов. Я не уверен, почему ваши общие живые укусы не меняются. В ваших IBActions ViewController, после добавления контроллеров представления в ваш стек навигации, вы освобождаете объекты, которые вы создаете? Я пропустил эту деталь ранее.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded brendan
Не уверен, как я пропустил детали ARC в вашем вопросе. Теперь я не уверен, почему это не выпускает.
в идеале это должен быть (IBAction) googlePressed: (id) отправитель {CustomWebView * customWebView = [[CustomWebView alloc] initWithStringURL: @ & quot;google.com"]; [self.navigationController pushViewController: customWebView animated: NO]; [выпуск customWebView]; }
0

@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;
}
1

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededneverError: User Rate Limit Exceeded

0

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Ну, я быстро взглянул на ваш код на Git и ничего очевидного, но, думаю, в конечном итоге я должен сказать: в чем проблема? Вы используете ARC. Управление памятью не ваша проблема. Если вы не видите утечку, которая НЕ указана на скриншоте, который вы опубликовали, в чем на самом деле проблема? Попробуйте использовать инструмент Allocations и посмотрите, какие объекты были созданы и их количество.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded brendan
Я пробовал только с одним указанным способом, и я получаю те же проблемы. Я разместил пример проекта на GitHub, чтобы показать мои проблемы с памятью.github.com/bfruin/WebViewMemory brendan

Похожие вопросы