NSString auto categoria modificadora dilema
-
19-09-2019 - |
Pergunta
Tanto trabalho, mas qual deles você usa e por quê?
@implementation NSString (Extender)
-(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix
{
while ([self hasPrefix:strPrefix])
{
self = [self substringFromIndex:strPrefix.length];
}
return self;
}
@end
ou
@implementation NSString (Extender)
-(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix
{
NSString *returnValue = [NSString stringWithString:self];
while ([returnValue hasPrefix:strPrefix])
{
returnValue = [returnValue substringFromIndex:strPrefix.length];
}
return returnValue;
}
@end
Solução
Opção # 2.
NSString se destina a ser um objeto imutável. Todas as padrão métodos "stringBy" na NSString retorno nova autoreleased NSStrings.
Enquanto nº 1 também acaba retornando uma nova NSString, é na melhor das hipóteses semanticamente incorreto e, na pior, alterando o objeto referenciado do que era suposto ser um objeto imutável.
Outras dicas
Em primeiro lugar, o Objective-C definição do método é exatamente equivalente a esta função C:
NSString* stringByTrimmingPrefix(NSString* self, SEL _cmd, NSString* strPrefix)
{
...
}
Como você pode ver, self
é apenas mais um parâmetro de função; você pode re-atribuí-la a qualquer coisa que você quer e não vai afetar o estado do original NSString * instância foi originalmente apontando.
Portanto, não há nada de errado com o que você está fazendo em sua primeira implementação, a esse respeito.
No entanto, nenhuma das suas implementações são muito eficientes, e ambos têm erros (o que acontece se você passar um prefixo com mais de um personagem?)
Gostaria de usar rangeOfString: opções: intervalo:. para encontrar seus prefixos, para que você só está criando no máximo uma instância NSString adicional
de modo que este apenas corta uma única letra de frente de uma corda (se a carta está lá mais de uma vez, ele vai cortar como muitos como existem)?
Desde NSString é imutável, não há uma diferença de qualquer forma, o desempenho sábio. No primeiro caso, você está substituindo auto com um novo objeto string cada vez, e no segundo caso, você está substituindo returnValue com um novo objeto string cada vez. Eu acho que desde a primeira opção salva uma linha de código i iria usar aquele.