In Cocoa het ek nodig om 'n voorwerp vanaf die ontvangs van KVO kennisgewings wanneer deallocating dit verwyder?

StackOverflow https://stackoverflow.com/questions/13927

  •  08-06-2019
  •  | 
  •  

Vra

As ek 'n voorwerp het geregistreer cat om KVO kennisgewings te ontvang van 'n ander voorwerp bar (met behulp van addObserver: ...), as ek dan deallocate cat het ek nodig om 'n removeObserver:forKeyPath: boodskap te stuur na bar in -dealloc?

Was dit nuttig?

Oplossing

Jy moet -removeObserver:forKeyPath: gebruik om die waarnemer verwyder voordat -[NSObject dealloc] loop, so ja, doen dit in die -dealloc metode van jou klas sal werk.

Beter as wat al sou wees om 'n deterministiese punt waar alles wat die eienaar van die voorwerp wat doen die waarneming kon dit vertel dit gedoen en sal (uiteindelik) word deallocated het. Op dié manier, jy kan ophou waarneem onmiddellik wanneer die ding doen die waarneming nie meer nodig is, ongeag van wanneer dit eintlik is deallocated.

Dit is belangrik om in gedagte te hou, want die leeftyd van voorwerpe in Cacao is nie as deterministies soos sommige mense dink dit is. Die verskillende Mac OS X raamwerke hulself sal stuur jou voorwerpe -retain en -autorelease, die uitbreiding van hul leeftyd as wat jy andersins sou kon dink dit sou wees.

Verder, wanneer jy die oorgang na Objective-C vullisverwydering maak, sal jy dit -finalize sal loop teen 'n baie verskillende tye vind - en in baie verskillende kontekste - as -dealloc het. Vir een ding, finalisering vind plaas op 'n ander draad, sodat jy werklik kan nie veilig -removeObserver:forKeyPath: stuur na 'n ander voorwerp in 'n -finalize metode.

Hou by geheue (en ander skaars hulpbron) bestuur in -dealloc en -finalize, en gebruik 'n aparte -invalidate metode om 'n eienaar vertel 'n voorwerp jy klaar is met dit op 'n deterministiese punt; doen dinge soos die verwydering van KVO Waarnemings daar. Die bedoeling van jou kode sal duideliker wees en jy sal minder subtiele foute om te sorg vir het.

Ander wenke

'n bietjie ekstra info wat ek gekry deur pynlike ervaring: hoewel NSNotificationCenter gebruike Nulstellen swak verwysings wanneer hy hardloop onder vullisverwydering, KVO nie. Dus, kan jy wegkom met 'n NSNotificationCenter waarnemer nie die verwydering van wanneer die gebruik van GC (wanneer die gebruik van behou / release, nog jy nodig het om jou waarnemer verwyder), maar jy moet nog steeds verwyder jou KVO waarnemers, soos Chris beskryf.

Beslis stem saam met Chris op die "Bly by geheue (en ander skaars hulpbron) bestuur in -dealloc en -finalize ..." kommentaar. Daar is baie keer ek sien mense probeer om NSTimer voorwerpe ongeldig in hul dealloc funksies. Die probleem is, NSTimer behou dis teikens. Dus, as die teiken van daardie NSTimer is self, dealloc sal nooit ontslae genoem wat lei tot 'n potensieel nare geheue lekkasies.

Ontvalideer in -invalidate en doen ander geheue opruim in jou dealloc en finalize.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top