2014-10-17 3 views
3

По различным причинам, чтобы поддерживать индексы массива в соответствии с другими вещами, у меня есть [NSNull null] внутри массива. Как это:isEqual: и isKindOfClass: - Что быстрее?

NSArray *arr = @[obj1, obj2, obj3, [NSNull null], obj4]; 

Есть два способа я рассматриваю возможность использования при переборе массива, чтобы убедиться, я игнорировать значение null, но я не уверен, что быстрее.

Метод 1

for (id obj in arr) { 

    if (![[NSNull null] isEqual:obj]) { 

     //Do stiff 
    } 
} 

Метод 2

for (id obj in arr) { 

    if ([obj isKindOfClass:[MyObject class]]) { 

     //Do stiff 
    } 
} 

Мой вопрос: Так как я итерация через этот массив, чтобы соответствующим образом обрабатывать плиточный вид прокрутки (поэтому она выполняется много раз, когда пользователь прокручивает страницы, и очень важно, чтобы он выполнялся как можно быстрее), , который один из этих методов работает быстрее?

+2

'[NSNull null]' - это одноэлементный объект, и вы можете протестировать с '==' просто отлично – Jack

+1

Вы можете написать небольшой тест и посмотреть сами. Xcode 6 поддерживает этот тип тестирования. – Abizern

+0

@JackWu Как насчет этого SO ответ rmaddy? [Ссылка] (http://stackoverflow.com/a/16600375/1145804) – rebello95

ответ

1

[NSNull null] - одноэлементный, поэтому проще всего проверить, является ли указатель объекта одинаковым.

Если вы действительно хотите, чтобы быть быстрым, сделать это:

for (id obj in arr) { 
    if ([NSNull null]!=obj) { 
     //Do stuff 
    } 
} 

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

Опцион обсуждается в комментариях, чтобы положить [NSNull null] в локальной переменной для ускорения проверки, но вполне возможно, что компилятор делает это для вас, так что я просто положить это здесь для справки:

NSObject *null_obj=[NSNull null]; 
for (id obj in arr) { 
    if (null_obj!=obj) { 
     //Do stuff 
    } 
} 
+2

Вытягивание вызова из [NSNull null] из цикла и его скопление в локальной переменной будет еще быстрее. –

+0

да, это тоже было моим мнением, но я ожидаю, что компилятор сделает это, так что не на 100% уверен, и ленив сделать тест – tomsoft

+2

Компилятор вообще не может кэшировать результаты вызовов методов для вас так, как он может для функций. Вы можете изменить во время выполнения, который вызывается (через swizzling или dynamic dispatch, например). Хотя мы знаем, что 'null' возвращает одноэлемент, для компилятора это сложно (невозможно) доказать. –