Využití paměti na metodě pohodlí vs metody init

hlasů
4

Nedávno, když jsem se podíval do správy paměti iPhone, jsem se snažil srovnat metodu smíšeného a metodu init na stejný objekt. Například, mám UIImageView kde se zobrazuje stažený NSData:

Metoda Pohodlí:

imageView.image = [UIImage imageWithData:[downloads dataAtIndex:0]];

init metoda:

UIImage *aImage = [[UIImage alloc] initWithData:[downloads dataAtIndex:0]];
imageView.image = aImage;
[aImage release];

Když se snažím jít tam a zpět na pohledech zvýšit využití paměti a hit „Simuluje Memory Varování“, využití paměti pro aplikace změnila z 20MB na 18MB metodou pohodlí a metoda init šel z 20MB na 13MB okamžitě.

Také jsem čekal a ve styku s aplikací dát čas na uvolnění na autorelease pohodlí metody. Ale neklesla tolik.

Jiný než autorelease vs uvolňování, co ještě přispěl v tom rozdíl?

Položena 14/11/2008 v 10:17
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
4

Vaše autoreleased objekty vytvořené pomocí metod výhodných nebude uvolněna, dokud nebude vypuštění obsahující autorelease bazénu. Doporučuje se obalit náročné operace s pamětí uvnitř z NSAutoreleasePoolbloku, pokud bude dělat těžké použití z nich.

Odpovězeno 14/11/2008 v 18:40
zdroj uživatelem

hlasů
1

Něco, co jsem si všiml, že se autoreleased objekty pod tlak paměti, existuje systém GC, ke kterému dochází s nápadným výkon hit, pokud nechcete uvolnit své bazény včas.

Také pomocí metody init / uvolnění umožňuje, spotřeba paměti ve smyčkách stagnace, při použití autorelease bazénu vytváří hroty. V některých paměťových napadal contitions, rychlý nárůst objektů v autorelease bazénu může způsobit aplikace dostat spuštěn dříve, než systém podniká kroky, aby uklidit věci, jako je e-mailů, je otevřený, mobilní safari záložky a iTunes věci v chodu.

Sečteno a podtrženo, mám tendenci používat init více, protože to dělá spotřeba paměti mé žádosti je více konzistentní a vidím, méně problémů s stále spuštěn náhodně. Postupné zvýšení spotřeby paměti umožňuje démoni vyčistit systém bez zabíjení mé aplikace. A konečně, jak je poněkud stranou, pokud používáte @property klíčového slova ve svých třídách, musíte dávat pozor na věci jako:

myProperty = [NSMutableArray arrayWithCapacity:10];

Vzhledem k tomu, co se stane, je-li bazén v main.m třídě dostane shromažďují tato položka bude pryč, což způsobuje selhání v důsledku volání metody na uvolněného objektu. Pokud jste jej nastavit pomocí @property (nonatomic, ponechat) budete chtít použít:

self.myProperty = [NSMutableArray arrayWithCapacity:10];

ujistěte se, že visí kolem. Můžete se vyhnout všem, že jen tak se alloc init nicméně. Stačí sledovat své referenční počty, aby se ujistil, že nemáte dvojité odkazy, které způsobují úniky paměti.

Odpovězeno 13/05/2009 v 22:53
zdroj uživatelem

hlasů
1

Objekty vytvořené pomocí metod pohodlí jsou autoreleased, jak jsem si jist, že jste si vědomi. Nicméně, pokud nemáte AutoReleasePool v RunLoop, kde se vytváří obraz, pak bude objekt přidán do neexistující bazénu a nikdy řádně vyčištěn. To může být případ, pokud jsou spuštěny ve vlákně, a zapomněli vytvořit AutoReleasePool pro toto vlákno.

Chcete-li ověřit, zda se jedná o tento případ, můžete spustit nástroj * (těsnost) a uvidíte, co to hlásí.

Odpovězeno 14/11/2008 v 14:20
zdroj uživatelem

hlasů
1

Jediný rozdíl, který by mohl být příčinou je to, že imageWithData: nepoužívá mezipaměť systému obrazu, zatímco initWithData: ano. Takže možná je obraz, který je vyroben s inicializátor jej uvolňovat to obrazová data, když obdrží varování paměti, protože se může vrátit do systémové mezipaměti, zatímco ten, který je vytvořen pomocí metody pohodlí nemůže.

Odpovězeno 14/11/2008 v 10:42
zdroj uživatelem

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