Как реализуют UIActivityIndicatorView, когда UIWebView Загружается? (iPhone ObjC)

Каждый раз, когда Вы не нуждаетесь в полиморфизме, хотите семантику значения и хотите избежать выделения "кучи" и связанной сборки "мусора" наверху. Протест, однако, состоит в том, что структуры (произвольно большой) являются более дорогими для раздавания, чем ссылки класса (обычно одно машинное слово), таким образом, классы могли закончить тем, что были быстрее на практике.

9
задан Dave DeLong 21 August 2009 в 12:47
поделиться

2 ответа

С точки зрения дизайна, использование временных архивов будет более чистым, если эти данные не являются частью состояния объекта, и им следует отдавать предпочтение.

Никогда не делайте выбор дизайна по соображениям производительности до фактического профилирования. приложение. Вы можете просто обнаружить, что в конечном итоге получите худший дизайн, который на самом деле не лучше, чем исходный дизайн с точки зрения производительности.

На все ответы, которые рекомендуют повторно использовать объекты, если стоимость строительства / разрушения высока, важно отметить что, если вы должны повторно использовать объект от одного вызова к другому, во многих случаях объект должен быть сброшен до допустимого состояния между вызовами метода, и это также имеет свою стоимость. Во многих таких случаях стоимость сброса может быть сопоставима со строительством / разрушением.

Если вы не сбрасываете состояние объекта между вызовами, эти два решения могут дать разные результаты, так как в первом вызове аргумент будет инициализирован, и состояние, вероятно, будет различным между вызовами методов.

Безопасность потоков также оказывает большое влияние на это решение. Автоматические переменные внутри функции создаются в стеке каждого из потоков и, как таковые, по своей сути являются потокобезопасными. Любая оптимизация, которая подталкивает эту локальную переменную, чтобы ее можно было повторно использовать между различными вызовами, усложнит безопасность потоков и может даже привести к снижению производительности из-за конкуренции, которая может ухудшить общую производительность.

Наконец, если вы хотите сохранить объект между вызовами метода, я бы все равно не сделал его частным членом класса (он не является частью класса), а скорее деталью реализации (статическая переменная функции,

2
ответ дан 4 December 2019 в 10:05
поделиться

Почему вы устанавливаете индикатор активности на ноль в инициализации?

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     
  if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {      
     //Initialization code      
     m_activity = nil;  
   }    
   return self; 
}

Вызов суперинициализации индикатора из XIB (при условии, что вы подключили его к розетке в IB), но затем вы устанавливаете ссылку на nil после ее инициализации. Удалите эту строку. Затем вернитесь в конструктор интерфейса и установите флажок «Скрывать при остановке». Теперь вы можете упростить код, отображающий индикатор:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
   [m_activity stopAnimating];  
}

- (void)webViewDidStartLoad:(UIWebView *)webView {     
   [m_activity startAnimating];     
}

Параметр «Скрыть при остановке» заставляет индикатор скрываться, когда вы останавливаете его анимацию.

19
ответ дан 4 December 2019 в 10:05
поделиться