iOS: behulpzaamheid van didReceiveMemoryWarning:

stemmen
12

Ik ben op het deel van mijn ontwikkeling proces voor het opsporen van crashen en geheugenlekken. Als een strategie, zet je elke NSLog berichten of meldingen van iets dergelijks in didReceiveMemoryWarning:? De documentatie voor deze methode is nogal mager. Is het beter om te zeggen dat voordat een crash zal gebeuren, de UIViewController zal deze methode leiden? Is dat een startpunt voordat zelfs gaan vooruit met Instruments?

De vraag is gesteld op 24/02/2009 om 17:15
bron van user
In andere talen...                            


4 antwoorden

stemmen
28

OK, een aantal dingen op te merken:

  • didReceiveMemoryWarning te vragen voordat een out-of-geheugen crash. Niet andere crashes. Als u de waarschuwing goed omgaan met en geheugen vrij te maken, dan kunt u voorkomen dat de out-of-memory conditie en niet crashen.
  • U kunt een geheugen waarschuwing in de simulator onder het menu Hardware handmatig te activeren. Zeer aan te bevelen dit te doen om uw behandeling van didReceiveMemoryWarning testen.
  • Instruments helpt u bij het debuggen lekken (maar niet alle van hen) - het is niet echt die nuttig zijn voor crashes.
  • Nee, ik heb niet persoonlijk gebruik NSLog - Ik heb net breekpunt het geheugen waarschuwingen als ik debuggen.
antwoordde op 24/02/2009 om 18:20
bron van user

stemmen
5

Als de gebruiker liet een aantal apps te openen zult u zeer weinig geheugen tot je beschikking hebt. Dus soms didReceiveMemoryWarningkan worden opgeroepen door het systeem pas na 1 MB van het gebruik.

Het systeem noemt deze methode op al uw weergave controllers, als je een NSLog plaatsen in elk van uw weergave controllers, zult u merken dat.

Dan automatisch de methode viewDidUnloadwordt aangeroepen door het systeem op al uw weergave controllers (niet dealloc). Dus je moet al uw deallocation instructies in daar te zetten.

Je moet heel wat experimenten te maken, want als je app is complex vindt u veel crashes ondervindt voordat het beheer van het goed.

antwoordde op 22/09/2011 om 08:00
bron van user

stemmen
4

UPDATE Met ingang van iOS 6, UIViewControlleruitzichten zijn niet langer gelost in reactie op het geheugen waarschuwingen. In plaats daarvan gewoon je best doen om eventuele middelen die u redelijkerwijs kan opnieuw te maken (bv cachegeheugen opgeslagen gegevens) vrijgeven wanneer didReceiveMemoryWarningwordt genoemd.

UPDATE
Ik schreef mijn origineel antwoord toen ik nog een angry young man; de tijden zijn veranderd en eigenlijk, het is verkeerd.

Als u een app met één weergave controller en u ontvangt een herinnering waarschuwing, er is niet veel wat je kunt doen. Maar de dingen drastisch veranderen als u meerdere uitzicht controllers, want je kunt lossen alle de staat in verband met de niet voorste controllers. In feite [UIViewController didReceiveMemoryWarning]zal je prod in de goede richting door het lossen van uw niet-zichtbare uitzicht voor u (verrassing!). Wanneer de voorste view controller wordt afgewezen, wordt de onderliggende weergave geladen en bij de meeste moet de gebruiker alleen bewust te zijn van een vertraging, ook al intern kan uw app een volledige reboot hebben gedaan.

Dit is geen detail kunt u gemakkelijk achteraf, moet u het geheugengebruik in gedachten te houden vanaf het begin en ontwerp je multiview app in netjes inleesbare UIViewControllerstukken. In feite is het de moeite waard om uw code compatibel is met de simulator alleen maar om het geheugen waarschuwing functie te kunnen gebruiken.

Als het geheugen is overvloedig, niets is uitgeladen en alles is zijdezacht, en wanneer het geheugen laag is dingen blijven werken, zij het langzamer. Nu zou ik zeggen dat deze oplossing de eindige geheugen probleem is ideaal.

Om gebruik te maken van dit geheugen salon truc, overbelasting van de UIViewControllermethoden viewDidLoad, viewDidUnloaden viewWillUnload(iOS5, handig als het lossen van state vereist uw oog op de nog steeds bestaan, bijvoorbeeld als u niet wilt dat lekken uw OpenGL texturen & maken buffer, op iOS4 u kunt simuleren dit door overbelasting didReceiveMemoryWarningen het bijhouden van de zichtbaarheid van uw mening).

ORIGINAL, MORE zwartgallige ANSWER

didReceiveMemoryWarning is absoluut nutteloos.

Er is geen garantie dat als je geheugen vrij te maken (ja, dat geheel) dat je niet gedood.

In mijn bittere ervaring het werkt meestal als volgt op 2.x / 3.0:

  1. mediaserverd lekt een hoop geheugen

  2. mijn app wordt gedood

Helaas, de maaier denkt nooit doden mediaserverd.

Dus als het geheugengebruik is niet jouw schuld, heb je echt kreeg slechts twee keuzes:

  1. vraagt ​​de gebruiker om te rebooten (gebruiker neemt het is jouw schuld, schrijft een vernietigend review)

  2. hoop dat de dader crasht (mediaserverd verplicht vaak!)

antwoordde op 25/06/2009 om 11:41
bron van user

stemmen
3

Het doel van didReceiveMemoryWarning is om u een kans om geheugen vrij te maken of pop uitzicht op een crash te voorkomen geven. U zult het niet ontvangen op enig voorspelbare punt, omdat het hangt af van wat de gebruiker doet. Bijvoorbeeld, als de gebruiker is het luisteren naar de iPod, is er minder geheugen beschikbaar en u zult het eerder ontvangen.

De algemene vuistregel is dat je over 8 MB RAM-geheugen om mee te werken. Als je dicht bij die krijg je kunt verwachten het evenement te worden verhoogd. Als u toegang tot die veel RAM opzettelijk moet je een plan om iets aan te doen te hebben.

antwoordde op 24/02/2009 om 19:34
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more