NSString внутренности - как работает длина? - PullRequest
2 голосов
/ 09 июля 2011

У меня вопрос по внутренним компонентам NSString. Я хочу проверить длину строки, и в основном я хотел знать, знает ли NSString свою длину / считать каждый раз / считать и кэшировать результат.

Должен ли я хранить его длину и вычислять или вызывать метод длины каждый раз?

Чтобы проверить строку, я могу проверить ее на ноль ИЛИ запросить ее длину.

if (str != nil) {
  // compute
}

if ([str length]) {
  // compute
}

Какой из них самый быстрый? Какой из них более эффективен для памяти?

Спасибо

Ответы [ 5 ]

6 голосов
/ 09 июля 2011

Вот как работает CFStringGetLength:

(из http://opensource.apple.com/source/CF/CF-550.43/CFString.c)

/* Returns length; use __CFStrLength2 if contents buffer pointer has already been computed.
*/
CF_INLINE CFIndex __CFStrLength(CFStringRef str) {
    if (__CFStrHasExplicitLength(str)) {
        if (__CFStrIsInline(str)) {
                return str->variants.inline1.length;
        } else {
                return str->variants.notInlineImmutable1.length;
        }
    } else {
        return (CFIndex)(*((uint8_t *)__CFStrContents(str)));
    }
}

Так что для всех случаев должно быть O (1).

6 голосов
/ 09 июля 2011

Проверка для nil ("без объекта") наиболее определенно не такая же, как отправка сообщения length объекту (NSString). Только одна из условных проверок действительна для проверки «пустой» строки. («Пустая» строка является объектом и, следовательно, не nil.)

Более важный вопрос: хранит ли NSString длину или она завершается по часовой стрелке (как "обычная строка c")? NSString хранит длину как внутреннее свойство, поэтому length является операцией O (1).

Удачного кодирования.

2 голосов
/ 09 июля 2011

Два - тестирование указателя NSString на nil и тестирование длины NSString - никоим образом не эквивалентны. Может существовать объект NSString с нулевой длиной, и указатель на него не будет сравниваться равным нулю.

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

1 голос
/ 09 июля 2011

Добавление: тестирование по [длина строки] оценивается как 0 / ноль / НЕТ в обоих случаях (строка равна нулю и строка имеет нулевую длину).

1 голос
/ 09 июля 2011

NSString является неизменным классом, поэтому длина остается неизменной все время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...