Я думаю, что производительность будет весьма схожа. Издержки, которые включены при использовании Списка по сравнению с Массивом, по моему скромному мнению, когда Вы добавляете объекты к списку, и когда список должен увеличить размер массива, который это использует внутренне, когда способность массива достигнута.
предположим у Вас есть Список со Способностью 10, тогда Список увеличится, это - способность, как только Вы хотите добавить 11-й элемент. Можно уменьшить влияние производительности путем инициализации Способности списка к количеству объектов, которые это будет содержать.
, Но, чтобы выяснить, выполняет ли итерация по Списку с такой скоростью, как итерации по массиву, почему Вы не сравниваете ее?
int numberOfElements = 6000000;
List<int> theList = new List<int> (numberOfElements);
int[] theArray = new int[numberOfElements];
for( int i = 0; i < numberOfElements; i++ )
{
theList.Add (i);
theArray[i] = i;
}
Stopwatch chrono = new Stopwatch ();
chrono.Start ();
int j;
for( int i = 0; i < numberOfElements; i++ )
{
j = theList[i];
}
chrono.Stop ();
Console.WriteLine (String.Format("iterating the List took {0} msec", chrono.ElapsedMilliseconds));
chrono.Reset();
chrono.Start();
for( int i = 0; i < numberOfElements; i++ )
{
j = theArray[i];
}
chrono.Stop ();
Console.WriteLine (String.Format("iterating the array took {0} msec", chrono.ElapsedMilliseconds));
Console.ReadLine();
В моей системе; итерация по массиву заняла 33 мс; итерация по списку заняла 66 мс.
Честно говоря, я не ожидал, что изменение будет так очень. Так, я поместил свое повторение в цикл: теперь, я выполняю оба повторения 1000 раз. Результаты:
итерация Списка заняла 67 146 мс, выполняя итерации массива, взял 40 821 msec
Теперь, изменение больше не является настолько большим, но все еще...
Поэтому я запустил Отражатель.NET и метода get индексатора класса Списка, похож на это:
public T get_Item(int index)
{
if (index >= this._size)
{
ThrowHelper.ThrowArgumentOutOfRangeException();
}
return this._items[index];
}
, Как Вы видите при использовании индексатора Списка Список выполняет проверку, не выходите ли Вы из границ внутреннего массива. Эта дополнительная проверка идет со стоимостью.
Итак, похоже, что в Interface Builder нет способа сделать это, хотя вы можете установить атрибуты доступности для других элементов пользовательского интерфейса с помощью IB. Поэтому я установил тег на своей панели инструментов, а затем добавил этот код в свой метод viewWillAppear:
UIToolbar *bottombar = (UIToolbar*)[self viewWithTag:kBottomToolbar];
UIView *view = (UIView*)[bottombar.items objectAtIndex:0];
[view setAccessibilityLabel:NSLocalizedString(@"Add Bookmark", @"")];
[view setAccessibilityHint:NSLocalizedString(@"Add Bookmark", @"")];
и так далее для каждого элемента кнопки ...
Не самый элегантный, но он работает.
Попытка установить метки доступа вручную не сработала для меня с изображениями UIBarButtonItem. Однако, если бы я установил заголовок вручную, то этикетка сработала бы. Но под изображением отображается название.
В итоге я создал UIButtonItem и использовал его как пользовательский вид для UIBarButtonItem. Единственная потеря - это маскировка изображения, которую выполняет UIBarButtonItem. Добавлен бонус: доступность, настраиваемая в IB.
Я получил приведенный выше код для работы с UIBarButtonItems с одной дополнительной строкой:
[view setIsAccessibilityElement:YES];