Een doel instellen nihil versus afgifte + realloc

stemmen
9

Dit is niet een garbage collector omgeving

Ik heb een klasse-instantie variabele, die op een bepaald punt in mijn runtime, moet ik opnieuw te initialiseren met een andere dataset dan het oorspronkelijk werd gebouwd met.

Hypothetisch gesproken, wat als ik een NSMutableArrayof een NSMutableDictionary, zou het efficiënter om iets te doen zoals:

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

of gewoon,

myArr = nil;

Zal myArr, gemaakt laat het object en laat me zonder een verwijzing naar de opslag in het geheugen, dus ik kan hergebruik myArr, gemaakt?

De vraag is gesteld op 09/03/2009 om 17:03
bron van user
In andere talen...                            


6 antwoorden

stemmen
21

Als je dat doet myArr=nil;op zichzelf, dan heb je de aanwijzer waar u het kunt verzenden verloren releasebericht naar. Er is geen magie om releaseuw object.

En, zoals Georg zegt, zonder de mogelijkheid om uw object vrij te geven, dat het geheugen heeft 'gelekt'.

antwoordde op 09/03/2009 om 17:07
bron van user

stemmen
6

U kon een eigendom te gebruiken en krijgen bijna de syntax je wilt, zonder het geheugenlek.

Gebruik deze syntaxis om de array te verklaren

@property (readwrite, retain) NSMutableArray *myArray;

Dan opnieuw initialiseren als volgt uit:

[self setMyArray:[NSMutableArray array]];
antwoordde op 09/03/2009 om 17:59
bron van user

stemmen
5

Als u op Mac OS waren, niet iPhone OS Ik zou zeggen dat het hangt af van de vraag of de garbage collector niet is geactiveerd of:

  • met GC: gebruik myArr = nil;
  • zonder GC: gebruik [myArr release];

Helaas, op de iPhone, is er geen garbage collection, dus als je niet wilt geheugenlekken, moet u uw object vrij te geven zodra je niet meer nodig hebt.

antwoordde op 09/03/2009 om 17:13
bron van user

stemmen
4

Het eerste codeblok is prima. Echter, het tweede blok laat je niet met een reeks die u kunt gebruiken, dus het is niet voldoende. Half corrigeren van dat blok, ik denk dat je bedoelt:

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

Dit betekent echter niet bereiken wat je wilt omdat u niet vrijgeven myArr, gemaakt. Als je een setter voor myArr, gemaakt hebben gesynthetiseerd, dan kunt u de release gedrag dat u wilt van de instelling tot nul te krijgen, met behulp van de setter (self.myArr) in plaats van de toegang tot de aanwijzer direct (myArr, gemaakt). Het corrigeren van uw tweede blok volledig:

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

Nu hebben we gelijkwaardige code voorbeelden, de ene met setter nihil vrij te geven, de andere niet. Ze zijn hetzelfde.

MyArr, gemaakt als een veranderlijk array volgens deze voorbeelden, de meest efficiënte methode is om removeAllObjects gebruik vermijden van alle werkzaamheden van het vrijgeven enkel-geheugen op te eisen terug:

[myArr removeAllObjects];
antwoordde op 02/12/2009 om 11:08
bron van user

stemmen
1

Als wat je wilt is om de inhoud van een NSMutableArray / NSMutableDictionary gezet, kunt u ook removeAllObjects bellen en je hebt een nieuwe serie / dict om mee te werken.

antwoordde op 13/03/2009 om 22:37
bron van user

stemmen
1

Een manier om het verschil te realiseren is dit misschien: een verwijzing instellen naar een object tot nihil doet niets om het object, het doet alleen iets aan de referentie.

"Het loslaten van het object" is niet "niets", dus het doet dat niet. :) In een opgeschoond taal zou kunnen dat doen als een neveneffect van het schrappen van de referentie, maar in Objective C werkt het niet op die manier.

antwoordde op 09/03/2009 om 17:09
bron van user

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