NSString 자체 수정 카테고리 딜레마
-
19-09-2019 - |
문제
둘 다 작동하지만 어느 것을 사용하고 그 이유는 무엇입니까?
@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
해결책
옵션 #2.
NSString은 불변의 대상입니다. NSString의 모든 표준 "StringBy"메소드는 New AutorEleased NSStrings를 반환합니다.
#1은 또한 새로운 NSString을 반환하게되지만, 의미 적으로 부정확하고 최악의 경우 불변의 대상으로 여겨지는 것에 대한 참조 된 대상을 변경합니다.
다른 팁
첫째, Objective-C 메서드 정의는 다음 C 함수와 정확히 동일합니다.
NSString* stringByTrimmingPrefix(NSString* self, SEL _cmd, NSString* strPrefix)
{
...
}
보시다시피, self
또 다른 함수 매개변수입니다.원하는 항목에 다시 할당할 수 있으며 원래 가리키던 원래 NSString* 인스턴스의 상태에는 영향을 주지 않습니다.
따라서 첫 번째 구현에서 수행하는 작업에는 그 점에서 아무런 문제가 없습니다.
그러나 구현 중 어느 것도 매우 효율적이지 않으며 둘 다 버그가 있습니다(두 개 이상의 문자가 포함된 접두사를 전달하면 어떻게 되나요?)
나는 사용할 것이다 rangeOfString:옵션:범위: 접두사를 찾으려면 최대 하나의 추가 NSString 인스턴스만 생성하면 됩니다.
그래서 이것은 단지 끈 앞쪽에서 단일 문자를 자르고 있습니다 (그 글자가 두 번 이상 존재하면 많은만큼 잘 차단 될 것입니다)?
NSString은 불변이기 때문에 성능 현명한 차이가 없습니다. 첫 번째 경우에는 매번 자체를 새 문자열 객체로 교체하고 두 번째 경우 returnValue를 매번 새 문자열 객체로 교체합니다. 첫 번째 옵션이 코드 라인을 저장하기 때문에 그 코드를 사용하겠다고 생각합니다.