Keert de NSString terug van NSArray objectAtIndex als autorelease of behoud

Ik heb een string geretourneerd uit een array, vraag me gewoon af of ik hem moet vrijgeven na gebruik.

0

3 antwoord

Bekijk deze blogpost, die een goed overzicht geeft van de regels voor objectief C-geheugenbeheer: http://interfacelab.com/objective-c-memory-management-for-lazy-people/ .

In het bijzonder geldt regel # 1 hier - u hoeft alleen een object vrij te geven als u het bezit en het bezit als u het toewijst, kopieert of nieuw maakt (of als u het expliciet hebt behouden). Je hebt geen van die dingen gedaan, dus je hoeft het niet vrij te geven.

Of het nu autoreleased is of niet, hangt af van hoe de string oorspronkelijk is gemaakt, maar je hoeft je daar geen zorgen over te maken omdat je niet verantwoordelijk bent voor het vrijgeven ervan.

4
toegevoegd

De objecten die worden geretourneerd door -objectAtIndex: zijn technisch gezien beide.

De code ziet er ongeveer zo uit:

 -(id) objectAtIndex:(NSUInteger) index
 { 
      return [[objects_[index] retain] autorelease];
 }

Ze zijn dus niet van jou, maar als je het uit de array verwijdert, wordt het niet meteen deallocated.

1
toegevoegd
@wirrwarr Dit antwoord was voordat ARC bestond. De mechanica van containers (en retourwaarden in ObjC in het algemeen) veranderde op het moment dat ARC werd vrijgegeven, vanwege de toevoeging/het bestaan ​​van objc_retainAutoreleasedReturnValue .
toegevoegd de auteur Richard J. Ross III, de bron
@wirrwarr Handmatig geheugenbeheer onder recente versies van clang geeft nog steeds boogbewuste instructies (geen oproepen naar objc_msgSend, maar naar objc_retain, objc_release, etc.).
toegevoegd de auteur Richard J. Ross III, de bron
Maar het is niet waar, als objectAtIndex: het niet + behoudt en autoreleert. U kunt het eenvoudig controleren met deze code: gist.github.com/mkramskoy/f94755191b758fe430b3a777ea07932d
toegevoegd de auteur wirrwarr, de bron
Hm, maar ik heb het getest met handmatig geheugenbeheer, zoals je kunt zien aan mijn hand. Ik denk niet dat MMM-gedrag kan veranderen als ARC wordt geïntroduceerd vanwege compatibiliteit met de back-up, of mis ik hier iets?
toegevoegd de auteur wirrwarr, de bron

autoreleased.

Dat wil zeggen met (bijna?) Elk object dat door een methode wordt geretourneerd, zou het geheugenbeheer te ingewikkeld maken als dat niet het geval was. Daarom houden we allemaal van autorelease.

0
toegevoegd
Een paar uitzonderingen: + nieuw , + toewijzen en -init volgen mijn hoofd niet volgens die regels.
toegevoegd de auteur Richard J. Ross III, de bron
Ja, maar ik wilde geen verwarring veroorzaken dat het niet nodig is om objecten vrij te geven die zijn gemaakt met + nieuw , + toewijzen en + init
toegevoegd de auteur Richard J. Ross III, de bron
uiteraard niet praten over die ..
toegevoegd de auteur Antwan van Houdt, de bron
Het is niet per se autoreleased; het wordt eenvoudigweg niet erkend door de beller.
toegevoegd de auteur Josh Caswell, de bron