Dobrý deň,
Ja som úplne neskúsený pri kontrole úniku pamäte, a tak by akákoľvek pomoc s týmto by bola skvelá.
Práve som dokončil väčšinu práce pre mňaiPhone aplikácie a ja sa teraz snažím zistiť, prečo prestane fungovať po niekoľkých bežiacich.Používanie nástrojov v úniku a prideľovanie režime môžem vidieť, sú tam dva objekty, ktoré nahromadia pamäť pomerne rýchlo a nie uvoľnenie:
Nie som stopercentne istý, kde alebo prečo sa to deje, ale keď som klikol na šípku napravo od UIDeviceRGBColor, zodpovedný volajúci je uvedený ako
[UIColor allocWithZone];
Urobil som prehľad v mojom projekte pre UICcolor a prišiel som to (berte na vedomie _colorThreshold):
Verím, že môj problém súvisí s _colorThreshold, ktorý sa nezdá byť prepustený:
Snažil som sa pridať autorelease k ich argumentom inicializácie, ale to spôsobilo zlyhanie aplikácie.
EDIT 1
Tu je snímka obrazovky z LevelMeter.h
odpovede:
2 pre odpoveď č. 1Existuje niekoľko problémov s vyššie uvedeným:
- Je LevelMeterColorThreshold trieda Objective-C?
- Ak áno, prečo používate malloc namiesto zvyčajného prideľovania / inicializácie?
- Pri vkladaní snímok obrazovky výsledkov vyhľadávania nemôžeme vidieť okolitý kód, keďže sa zobrazujú len riadky s výsledkami vyhľadávania.
Zaznamenáva úniková príručka Leaks, alebo len prideľujete nepotrebnú pamäť?
Medzi týmito dvoma prípadmi je rozdiel:
- Neúspech sa stane, ak uvoľníte odkaz na objekt, takže ho nemôžete poslať a
release
správu neskôr. - Instanciačné objekty, ktoré už nie sú potrebné bez uvoľňovania / uvoľňovania
Úniky môžu zistiť iba prvý prípad.
Vzorka na únik:
NSMutableString* test = [[NSMutableString alloc] initWithString:@"1"];
NSLog(@"%@", test);
NSMutableString* anotherTest = [[NSMutableString alloc] initWithString:@"2"];
test = anotherTest; //here we loose reference to the original object
NSLog(@"%@", test);
Priradením iného testu k testu sme stratili odkaz, ktorý ukazuje na pamäťovú adresu, ktorá obsahuje @ 1.