'NSCharacterSet' может не отвечать на '-count' - PullRequest
0 голосов
/ 23 октября 2010

Я получил предупреждение в

NSCharacterSet *myCharSet3 = [NSCharacterSet characterSetWithCharactersInString:query3]; 
int chr_count3;
chr_count3=[myCharSet3 count];

Как исправить это предупреждение?

Ответы [ 3 ]

4 голосов
/ 23 октября 2010

, в частности, NSCharacterSet экземпляры не отвечают на селектор count.

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

попытки вызвать этот метод во время выполнения вызовут исключение (или он может уже быть реализован как закрытый метод, и в этом случае исключение не будет; хотя вы не должны полагаться на это).

3 голосов
/ 23 октября 2010

NSCharacterSet официально не предоставляет метод подсчета.Однако в моем тестировании [myCharSet3 count] фактически дает правильный результат.Так что просто чтобы избавиться от предупреждения:

chr_count3 = (int)[myCharSet3 performSelector:@selector(count)];

Но я не думаю, что это хорошая идея.

0 голосов
/ 18 августа 2015

Вот реализация count для NSCharacterSet.Я предполагаю, что внутреннее устройство NSCharacterSet использует bitmapRepresentation, предоставляемое в API, и что characterIsMember полагается на это и работает быстро.Вероятно, быстрее выполнять манипуляции с указателями непосредственно над данными bitmapRepresentation (см. Документацию Apple по последнему методу для проверки членства), но я бы предпочел придерживаться этой читаемой версии.Цикл из 65536 итераций не так уж плох в большинстве ситуаций, и если вы будете часто вызывать его, вы также можете кэшировать возвращаемое значение при работе с неизменным классом.Замените "foobar" своим собственным префиксом, чтобы избежать конфликтов с частной внутренней реализацией count.

- (NSUInteger)foobar_count
{
    NSUInteger count = 0;
    for (NSUInteger i = 0; i < 8192 * 16; i ++)
    {
        if ([self characterIsMember:(unichar)i])
        {
            count ++;
        }
    }
    return count;
}
...