NSString дилемма самоизменяющейся категории - PullRequest
1 голос
/ 10 января 2010

Оба работают, но какой бы вы использовали и почему?

@implementation NSString (Extender)

    -(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix 
    {
        while ([self hasPrefix:strPrefix]) 
        {
            self = [self substringFromIndex:strPrefix.length];
        }
        return self;
    }

@end

или

@implementation NSString (Extender)

    -(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix 
    {
        NSString *returnValue = [NSString stringWithString:self];
        while ([returnValue hasPrefix:strPrefix]) 
        {
            returnValue = [returnValue substringFromIndex:strPrefix.length];
        }
        return returnValue;
    }

@end

Ответы [ 3 ]

4 голосов
/ 10 января 2010

Вариант № 2.

NSString предназначен для того, чтобы быть неизменным объектом. Все стандартные методы "stringBy" в NSString возвращают новые автоматически освобожденные строки NSString.

Хотя # 1 также заканчивается возвратом новой строки NSSt, в лучшем случае она семантически неверна, а в худшем случае изменяет ссылочный объект, который должен был быть неизменным.

4 голосов
/ 10 января 2010

Во-первых, ваше определение метода Objective C в точности эквивалентно этой функции C:

NSString* stringByTrimmingPrefix(NSString* self, SEL _cmd, NSString* strPrefix)
{
    ...
}

Как видите, self - это просто еще один параметр функции; Вы можете переназначить его на что угодно, и это не повлияет на состояние исходного экземпляра NSString *, на который он первоначально указывал.

Так что нет ничего плохого в том, что вы делаете в своей первой реализации, в этом отношении.

Однако ни одна из ваших реализаций не очень эффективна, и обе имеют ошибки (что произойдет, если вы передадите префикс с более чем одним символом?)

Я бы использовал rangeOfString: options: range: , чтобы найти ваши префиксы, чтобы вы могли создать не более одного дополнительного экземпляра NSString.

См. Поиск, сравнение и сортировка строк

0 голосов
/ 10 января 2010

так что это просто отрубает одну букву в начале строки (если эта буква присутствует более одного раза, она обрежет столько, сколько есть)?

Так как NSString является неизменным, я не вижу разницы в любом случае, с точки зрения производительности. В первом случае вы заменяете себя новым строковым объектом каждый раз, а во втором случае вы заменяете returnValue новым строковым объектом каждый раз. Я думаю, так как первый вариант сохраняет строку кода, я бы использовал эту.

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