MonoTouch и IDisposable Pattern - PullRequest
       44

MonoTouch и IDisposable Pattern

3 голосов
/ 08 октября 2011

Читая документацию MT, я видел, что можно освободить память, также реализуя шаблон IDisposable .NET.

Например, в пользовательском классе, который расширяет UIViewController (MyViewController), я мог бы переопределить следующий метод:

public override void Dispose (bool disposing)
{
   if (disposing){
     // do some stuff here
   }
   base.Dispose (disposing)
}

Начиная с этого момента, мои два вопроса:

  1. Какой тип элементов я должен выпустить в дополнение к изображениям?
  2. Нужно ли вызывать метод Dispose из экземпляра класса MyViewController (myViewController.Dispose ()) или метод Dispose вызывается автоматически, как метод dealloc?

Спасибо заранее. С уважением.

1 Ответ

3 голосов
/ 08 октября 2011

Первое использование MonoTouch IDisposable идентично Mono или .NET. То, что вы читаете по этому вопросу в другом месте, на stackoverflow или на MSDN ..., будет применяться здесь.

Что важно для MonoTouch, так это помнить, что NSObject реализует IDisposable, что имеет большой смысл, поскольку представляет собственный объект. Это означает, что все, что наследуется от NSObject, довольно большой части monotouch.dll , реализует IDisposable.

  1. Какой тип элементов я должен выпустить в дополнение к изображениям?

Большинство управляемых Экземпляры объектов на основе NSObject имеют небольшие размеры, но они могут представлять большие собственные объекты ( GC будет знать только о первом управляемом размере ).

Так что лучше всего избавляться от экземпляров на основе NSObject, например, когда это возможно. когда вы используете их в качестве локальных переменных. Шаблон using позволяет легко сделать это в C #.

OTOH, используйте ваше суждение, маленький NSString не займет много памяти, в то время как другие могут быть большими (или неизвестными, например, NSString GetWebPageContent (NSUrl).

  1. Нужно ли вызывать метод Dispose из экземпляра класса MyViewController (myViewController.Dispose ()) или метод Dispose вызывается автоматически, как метод dealloc?

Часть шаблона Dispose гарантирует, что финализатор вызовет Dispose, если он не был вызван ранее. Таким образом, GC , в конечном счете, освободит память (как управляемую, так и неуправляемую / собственную), связанную с этими экземплярами.

Возможно, вы захотите использовать некоторые инструменты, такие как Жандарм (который будет работать на OSX) или FxCop (только для Windows), который сообщит вам (например), если некоторые из ваших типов имеют поля IDisposable которые не расположены должным образом.

Отказ от ответственности : я поддерживаю Жандарма: -)

...