UIwebview Fuite

paddevpaddev Membre
Bonjour,

quand je crée une webview pour aller sur your tube pour regarder une video , j'ai enormémént de fuite .
Voici le code de ma webview:

NSString *htmlString = @&quot;&lt;html&gt;&lt;head&gt;&lt;meta name = &#092;&quot;viewport&#092;&quot; content = &#092;&quot;initial-scale = 1.0, user-scalable = no, width = 212&#092;&quot;/&gt;&lt;/head&gt;&lt;body style=&#092;&quot;background:#F00;margin-top:0px;margin-left:0px&#092;&quot;&gt;&lt;div&gt;&lt;object width=&#092;&quot;212&#092;&quot; height=&#092;&quot;172&#092;&quot;&gt;&lt;param name=&#092;&quot;movie&#092;&quot; value=&#092;&quot;http://www.youtube.com/watch?v=1x8AnJAI6Go&amp;f=gdata_videos&amp;c=ytapi-my-clientID&amp;d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM&#092;&quot;&gt;&lt;/param&gt;&lt;param name=&#092;&quot;wmode&#092;&quot; value=&#092;&quot;transparent&#092;&quot;&gt;&lt;/param&gt;&lt;embed src=&#092;&quot;http://www.youtube.com/watch?v=1x8AnJAI6Go&amp;f=gdata_videos&amp;c=ytapi-my-clientID&amp;d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM&#092;&quot;type=&#092;&quot;application/x-shockwave-flash&#092;&quot; wmode=&#092;&quot;transparent&#092;&quot; width=&#092;&quot;212&#092;&quot; height=&#092;&quot;172&#092;&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;&quot;;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [webViewFacebook loadHTMLString:htmlString baseURL:[NSURL URLWithString:@&quot;http://www.your-url.com&quot;]];


Je release bien ma webview dans le dealloc.
En fait quand la video est en marche , voici ce qu'indique Instruments:

&nbsp;  0 libsystem_c.dylib calloc<br />&nbsp;  1 libdispatch.dylib dispatch_source_create$VARIANT$up<br />&nbsp;  2 CFNetwork __CFURLCache::StartWorkerThreadAndOpenPersistentStore(__CFString const*, unsigned char)<br />&nbsp;  3 CFNetwork __CFURLCache::SetDiskCapacity(long)<br />&nbsp;  4 CFNetwork CFURLCacheSetDiskCapacity<br />&nbsp;  5 Foundation -[NSURLCache setDiskCapacity:]<br />&nbsp;  6 WebKit +[WebView(WebFileInternal) _setCacheModel:]<br />&nbsp;  7 WebKit __+[WebView(WebFileInternal) _preferencesChangedNotification:]_block_invoke_16<br />&nbsp;  8 WebCore HandleRunSource<br />&nbsp;  9 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__<br />&nbsp; 10 CoreFoundation __CFRunLoopDoSources0<br />&nbsp; 11 CoreFoundation __CFRunLoopRun<br />&nbsp; 12 CoreFoundation CFRunLoopRunSpecific<br />&nbsp; 13 CoreFoundation CFRunLoopRunInMode<br />&nbsp; 14 WebCore RunWebThread(void*)<br />&nbsp; 15 libsystem_c.dylib _pthread_start<br />&nbsp; 16 libsystem_c.dylib thread_start<br />

<br />Leaked Object	#	Address	Size	Responsible Library	Responsible Frame<br />Malloc 128 Bytes,1	0x1c9880	128 Bytes	libdispatch.dylib	dispatch_source_create$VARIANT$up<br />


Avez vous une solution pour mon problème.
J'ai l'impression qu'il y a un souci avec urlconnection car a chaque fois que je crée une webview dans mon appli pour afficher une page internet, au bout d'un moment l'appli plante car je reçois un "receive memory warning"...surtout quand je lit une video..

Merci

Réponses

  • DrakenDraken Membre
    novembre 2011 modifié #2
    Release ? C'est un dinosaure du Crétacé, non ? Vas lire la doc Apple sur ARC et laisse Xcode s'occuper lui-meme de la gestion mémoire. Tu gagneras un temps fou dans ton développement.

    http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

    La gestion mémoire "automatique" est l'une des principales innovations de Xcode 4.2. Plus besoin de s'embêter à  mettre des release/retain dans le code. Plus à  chercher ces &§@ de fuites mémoire !

  • paddevpaddev Membre
    21:20 modifié #3
    merci pour la reponse je vais regarder cela, Vous pensez que cela viens du release?
  • AliGatorAliGator Membre, Modérateur
    21:20 modifié #4
    dans 1320514861:

    Release ? C'est un dinosaure du Crétacé, non ? Vas lire la doc Apple sur ARC et laisse Xcode s'occuper lui-meme de la gestion mémoire. Tu gagneras un temps fou dans ton développement.

    http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

    La gestion mémoire "automatique" est l'une des principales innovations de Xcode 4.2. Plus besoin de s'embêter à  mettre des release/retain dans le code. Plus à  chercher ces &§@ de fuites mémoire !
    Beurk ARC... toujours pas réussi à  m'y mettre moi...

    Je préfère encore faire les choses moi-même ;)
    Ca me donne un peu l'impression de ces gâteaux tout faits où y'a plus qu'à  verser la poudre et rajouter du lait ou quoi... alors que c'est tellement plus sympa et meilleur (et pas plus compliqué) de faire le gâteau soi-même !
  • paddevpaddev Membre
    21:20 modifié #5
    tout pareil!
    mais mon probleme n'est toujours pas resolu..
  • paddevpaddev Membre
    21:20 modifié #6
    D'autant plus que je viens de me servie de ARC et que j'ai toujours le mem probleme avec ma webview arghhhhhh
    un coup de pouce serai le bienvenue
    Le probleme arrive des que la video est sur play, dans un instrument il y a plein de drapeau noir qui s'affiche et il me met toujours ce leak:

    Leaked Object	#	Address	Size	Responsible Library	Responsible Frame<br />Malloc 128 Bytes,1	0x1a5630	128 Bytes	libdispatch.dylib	dispatch_source_create$VARIANT$up<br />
    


    je vois pas du tout comment m'en sortir.
  • CéroceCéroce Membre, Modérateur
    21:20 modifié #7
    Tu ne peux pas t'en sortir. D'après ce que tu nous indiques, la fuite est détectée dans libdispatch.
    Tu peux corriger les fuites mémoires de ton propre code, mais pas celles dans le code des autres !

    Il ne faut pas croire que le code d'Apple, entre autres, est exempt de bogue de gestion mémoire.

    ARC analyse TON code et place les release et retain où il faut. Ce qui explique totalement qu'il ne puisse pas régler les problèmes de libdispatch.

    Pour finir, il arrive que l'analyseur statique se trompe. Un cas classique est celui d'un objet qui doit appeler une méthode déléguée, dans laquelle on en profite pour envoyer un release à  l'objet. La gestion mémoire est correcte, mais l'analyseur dira le contraire.
  • paddevpaddev Membre
    21:20 modifié #8
    ah ok car dans mon appli j'ai une webview avec facebook et une autre pour you tube et les deux donne le même resultat ... du coup bizarement j'ai un "receive memory warning ".
    J'ai mis une image de fond dans le 'morenavigationcontroller" qui bizarement disparait quand je reçois ce "memory warning" et ça c'est embetant voici d'ailleurs le code de ma class tabbar que j'ai crée pour pouvoir gerer l'orientation de certaine vue.
    Qu'est ce qui peut faire que cette image disparaisse?

    #import &quot;RotatingTabBarController.h&quot;<br />#import &quot;KTPhotoScrollViewController.h&quot;<br /><br /><br />@implementation RotatingTabBarController<br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp;  if ([self.moreNavigationController.topViewController isKindOfClass:[KTPhotoScrollViewController class]]&nbsp; ) <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (interfaceOrientation == UIInterfaceOrientationPortrait ||interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);<br />	<br />	return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />&nbsp; &nbsp; &nbsp; &nbsp; <br /><br /> <br /> <br />}<br /><br />- (void)viewDidLoad {<br />&nbsp; &nbsp; <br />&nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; UINavigationController *moreController = self.moreNavigationController;<br />&nbsp; &nbsp; moreController.navigationBar.barStyle = UIBarStyleBlackOpaque;<br />&nbsp; &nbsp; moreController.navigationBar.topItem.title=@&quot;Plus&quot;;<br />&nbsp; &nbsp; if ([moreController.topViewController.view isKindOfClass:[UITableView class]])<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; UITableView *view = (UITableView *)moreController.topViewController.view;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  view.scrollEnabled=NO;<br />&nbsp; &nbsp; &nbsp; &nbsp;  UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@&quot;eleazar_fond.png&quot;]];<br />&nbsp; &nbsp; &nbsp; &nbsp; [view setBackgroundView:imageView];<br />&nbsp; &nbsp; &nbsp; &nbsp; moreTableViewDataSource = [[MoreTableViewDataSource alloc] initWithDataSource:view.dataSource];<br />&nbsp; &nbsp; &nbsp; &nbsp; view.dataSource = moreTableViewDataSource;<br />&nbsp; &nbsp; &nbsp; &nbsp; UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];<br />&nbsp; &nbsp; &nbsp; &nbsp; footer.backgroundColor=[UIColor clearColor];<br />&nbsp; &nbsp; &nbsp; &nbsp; view.tableFooterView=footer;<br />&nbsp; &nbsp; }<br /> <br />&nbsp; &nbsp; &nbsp; [super viewDidLoad];<br />}<br /><br /><br />- (void)didReceiveMemoryWarning<br />{<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [super didReceiveMemoryWarning];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />
    
  • AliGatorAliGator Membre, Modérateur
    21:20 modifié #9
    Mais heu tu n'as pas implémenté viewDidUnload (ou didReceiveMemoryWarning) ?
    Et c'est bizarre ton code utilisant l'introspection (isKindOfClass) pour faire ton truc ?!
  • FKDEVFKDEV Membre
    21:20 modifié #10
    Dans la doc de UIWebView :
    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.

    Cela dit je ne sais pas si cela corrige ton leak. Ce n'est peut-être pas un leak d'ailleurs. J'ai souvent des "leaks" affichés dans le code Apple, j'ai l'impression que ce sont des ressources uniques qui sont réservées quand tu en as besoin et qui ne sont libérées qu'à  la fermeture de l'app.
    Peut-etre que la méthode qu'utilise Instrument n'est pas adapté à  suivre ce type d'allocations qui JE SUPPOSE même quand elles ne sont plus référencées par personne sont conservés pour des problèmes de perfs.

  • paddevpaddev Membre
    21:20 modifié #11
    Comment dois implenter viewdidunload et didreceivememory??
  • cyranocyrano Membre
    novembre 2011 modifié #12
    dans 1320570918:


    Cela dit je ne sais pas si cela corrige ton leak. Ce n'est peut-être pas un leak d'ailleurs. J'ai souvent des "leaks" affichés dans le code Apple, j'ai l'impression que ce sont des ressources uniques qui sont réservées quand tu en as besoin et qui ne sont libérées qu'à  la fermeture de l'app.
    Peut-etre que la méthode qu'utilise Instrument n'est pas adapté à  suivre ce type d'allocations qui JE SUPPOSE même quand elles ne sont plus référencées par personne sont conservés pour des problèmes de perfs.



    tu as un ex, un lien?


Connectez-vous ou Inscrivez-vous pour répondre.