2010-10-26 14 views
6

szukam na przykład internetowy, który zawiera ten kod w Objective-CCo to jest odpowiednik Monotouch dealloc?

-(void)dealloc { 
    [activeController viewWillDisappear:NO]; 
    [activeController.view removeFromSuperview]; 
    [activeController viewDidDisappear:NO]; 

    [activeController release]; 
    [super dealloc]; 
} 

zakładam odpowiednik MT byłoby zbyć, mam rację?

nie będę musiał zadzwonić do:

[activeController release]; 
    [super dealloc]; 

metod jak będą one zbierane na śmieci MonoTouch, jest to również prawidłowe?

Odpowiedz

14

MonoTouch jest zbiorem śmieci, więc nie musisz się martwić, że sam dokonasz dealokacji.

Powiedział, że są chwile, kiedy jesteś świadomy, że jesteś utrzymując kilka dużych zasobów pamięci i chcesz pomóc systemu poprzez umieszczenie zasobów od razu, zamiast czekać na śmieciarza do kopać.

W tym momencie wywołanie Dispose przydaje się: zwalnia zasoby, które są powiązane przed śmieciarem. Jest to szczególnie ważne w przypadku dużych obiektów, takich jak obrazy, ponieważ obrazy są przechowywane na stertach niezarządzanych, podczas gdy odniesienia obiektów są przechowywane w sterowanej stercie.

Oznacza to, że jeśli masz obraz o wielkości 8 megabajtów: 8 megabajtów jest przechowywanych w sterty niezarządzanej (zarządzanej przez Objective-C) i 1 wskaźniku (4 bajty) w sterowanej stercie. Jeśli chodzi o Garbage Collector Mono, używasz 4 bajty, a nie 8 megs.

Czasami tak jest, gdy możesz pomóc systemowi, nazywając dispose: wiesz, że niewinnie wyglądająca zmienna "myImage" wskazuje na dużą plamę pamięci.

+1

Bardzo interesujące rzeczy !! Pytanie dla Ciebie: Co" jako obrazy są przechowywane na stercie niezarządzanym, podczas gdy odniesienia do obiektów są przechowywane w "sterowana kupa" Czy możesz wyjaśnić, dlaczego obrazy są wstawiane do niezarządzanego sterty? Z góry dziękuję. –

1

Monotouch to śmieci zebrane. Zanim obiekt zostanie zebrany, wywoływany jest destruktor obiektu.

Oto Microsoft's page about C# destructors. Nie wiem, czy w Monotouch jest odpowiednia dokumentacja dla destruktorów.

1

Nie musisz dzwonić do wersji release lub dealloc, opiekuje się nimi MonoTouch.

0

Od Xamarin Dokumentacji

http://docs.xamarin.com/ios/advanced_topics/api_design#When_to_call_Dispose

Należy zadzwonić Dispose kiedy trzeba Mono w pozbyciu Twojego obiektu. Możliwym przypadkiem użycia jest sytuacja, w której Mono nie ma wiedzy, że twój NSObject rzeczywiście zawiera odniesienie do ważnego zasobu, takiego jak pamięć lub puli informacji. W takich przypadkach powinieneś zadzwonić do Dispose, aby natychmiast zwolnić odniesienie do pamięci, zamiast czekać, aż Mono wykona cykl zbierania śmieci. Wewnętrznie, gdy Mono tworzy odwołania NSString z ciągów C#, będzie je natychmiast usuwał, aby zmniejszyć ilość pracy, jaką musi wykonać garbage collector. Im mniej obiektów do załatwienia, tym szybciej GC będzie działał. "

Powiązane problemy