Sette et objekt null versus utgivelsen + realloc

stemmer
9

Dette er ikke en søppel samlet miljø

Jeg har en klasse forekomst variabel som på et eller annet punkt i min kjøretid, må jeg å initial med en annen datasettet enn det opprinnelig ble konstruert med.

Hypotetisk sett, hva om jeg har en NSMutableArrayeller en NSMutableDictionary, ville det være mer effektivt å gjøre noe slikt som:

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

eller bare,

myArr = nil;

Vil myArr slipper objektet og la meg uten en peker til lagring i minnet slik at jeg kan gjenbruke myArr?

Publisert på 09/03/2009 klokken 16:03
kilden bruker
På andre språk...                            


6 svar

stemmer
21

Hvis du gjør det myArr=nil;av seg selv, så du har mistet pekeren som du kan sende releasemeldingen til. Det er ingen magi til releaseobjektet.

Og, som Georg sier, uten å være i stand til å frigjøre objektet, som minnet har lekket.

Svarte 09/03/2009 kl. 16:07
kilden bruker

stemmer
6

Du kan bruke en eiendom og får nesten syntaksen du vil uten minnelekkasje.

Bruk denne syntaksen til å erklære matrisen

@property (readwrite, retain) NSMutableArray *myArray;

Deretter re-initialisere det slik:

[self setMyArray:[NSMutableArray array]];
Svarte 09/03/2009 kl. 16:59
kilden bruker

stemmer
5

Hvis du var på Mac OS, ikke iPhone OS jeg vil si at det kommer an på om søppel samler er aktivert eller ikke:

  • med GC: bruk myArr = nil;
  • uten GC: bruk [myArr release];

Dessverre, på iPhone, er det ingen søppelrydding, så hvis du ikke vil minnelekkasjer, må du frigjøre objektet når du ikke trenger den lenger.

Svarte 09/03/2009 kl. 16:13
kilden bruker

stemmer
4

Den første kodeblokken er i orden. Men den andre blokken ikke forlate deg med en rekke du kan bruke, så det er ikke tilstrekkelig. Halvparten korrigere denne blokken, jeg tror du mener:

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

Men dette betyr ikke oppnå det du ønsker enten fordi du ikke slipper myArr. Hvis du har syntetisert en setter for myArr, så kan du få utgivelsen oppførsel du ønsker fra å sette til null, ved hjelp av fuglehunden (self.myArr) i stedet for å få tilgang pekeren direkte (myArr). Korrigere andre blokken helt opp:

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

Nå har vi tilsvarende kodeeksempler, til en hjelp setter med null slipp, den andre ikke. De er de samme.

Hvis myArr er et foranderlig matrise som i disse eksempler, er den mest effektive metode for å bruke removeAllObjects, unngå alt arbeidet med å frigi minnet bare å kreve den tilbake:

[myArr removeAllObjects];
Svarte 02/12/2009 kl. 10:08
kilden bruker

stemmer
1

Hvis det du ønsker er å nullstille innholdet i en NSMutableArray / NSMutableDictionary, kan du også ringe removeAllObjects og du har en frisk utvalg / dict å jobbe med.

Svarte 13/03/2009 kl. 21:37
kilden bruker

stemmer
1

En måte å innse forskjellen kan være dette: Angi en referanse til et objekt til null gjør ingenting til objektet, det bare gjør noe med referansen.

"Frigjøring objektet" er ikke "ingenting", så det gjør ikke det. :) I en søppel-samlet språk kan det gjøre det som en bivirkning av slippe referanse, men i Objective C fungerer det ikke på den måten.

Svarte 09/03/2009 kl. 16:09
kilden bruker

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