Nastavení objekt nil oproti vydání + realloc

hlasů
9

Nejedná se o odpadky shromažďují prostředí

Mám třída instance proměnné, které v určitém okamžiku v mém běhu, musím znovu inicializovat s jinou sadou dat, než bylo původně konstruován s.

Hypoteticky řečeno, co když mám NSMutableArraynebo NSMutableDictionary, že by bylo účinnější udělat něco, jako jsou:

[myArr release];
myArr  = [[NSMutableArray alloc] init....];

nebo prostě,

myArr = nil;

Bude myArr uvolnit objekt a nech mě, aniž by ukazatel na ukládání v paměti, abych mohl znovu použít myArr?

Položena 09/03/2009 v 17:03
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
21

Máte-li dělat myArr=nil;sám, pak jste ztratili ukazatel, do kterého můžete poslat releasezprávu. Neexistuje žádný kouzelný do releasevašeho objektu.

A, jak říká Georg, aniž by byl schopen uvolnit svůj objekt, že paměť ‚unikly‘.

Odpovězeno 09/03/2009 v 17:07
zdroj uživatelem

hlasů
6

Dalo by se použít vlastnost a získat téměř syntaxe chcete bez úniku paměti.

Použijte tuto syntaxi deklarovat matice

@property (readwrite, retain) NSMutableArray *myArray;

Poté znovu inicializovat to takhle:

[self setMyArray:[NSMutableArray array]];
Odpovězeno 09/03/2009 v 17:59
zdroj uživatelem

hlasů
5

Pokud jste byli na Mac OS, není iPhone OS Řekl bych, že to záleží na tom, zda je garbage collector aktivováno nebo ne:

  • GC: použití myArr = nil;
  • bez GC: použití [myArr release];

Bohužel, na iPhone, není sběr odpadků, takže pokud nechcete, úniky paměti, budete muset uvolnit svůj objekt, jakmile již nepotřebujete.

Odpovězeno 09/03/2009 v 17:13
zdroj uživatelem

hlasů
4

První blok kódu je v pořádku. Nicméně, druhý blok nemá nechat s řadou můžete použít, takže to není dostačující. Polovina opravuje tento blok, myslím, že jste na mysli:

myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Nicméně, toto není dosáhnout toho, co chcete, a to buď proto, že nejste uvolnění myArr. Pokud jste syntetizoval setra pro myArr, pak se můžete dostat chování uvolňování chcete z nastavení na nulu, s použitím seřizovač (self.myArr) namísto přístupu ukazatel přímo (myArr). Opravuje svůj druhý blok plně:

self.myArr = nil;
myArr = [[NSMutableArray alloc] init....];

Nyní máme rovnocenné příklady kódu, jeden s použitím seřizovač s nulovou uvolnit, jiný ne. Jsou stejné.

Pokud myArr je proměnlivý pole jako v těchto příkladech, nejúčinnější metodou je použití removeAllObjects, aby se zabránilo všechny práce uvolňování paměti pouze nároku zpět:

[myArr removeAllObjects];
Odpovězeno 02/12/2009 v 11:08
zdroj uživatelem

hlasů
1

Jestli to, co chcete, je obnovit obsah právního NSMutableArray / NSMutableDictionary, můžete také volat removeAllObjects a máte čerstvou pole / dict pracovat.

Odpovězeno 13/03/2009 v 22:37
zdroj uživatelem

hlasů
1

Jeden způsob, jak si uvědomit rozdíl by mohl být tento: Nastavení odkazu na objekt nil nedělá nic, aby objekt, to dělá jen něco odkazu.

„Uvolnění objektu“ není „nic“, tak to nedělá. :) V jazyce garbage collector to mohl udělat, že jako vedlejší účinek klesá odkaz, ale v Objective C, to nefunguje takhle.

Odpovězeno 09/03/2009 v 17:09
zdroj uživatelem

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