2010-01-10 5 views
1

둘 다 작동하지만 어떤 것을 사용하겠습니까? (그 편지는, 거기있는 많은으로 차단됩니다 번 이상이 더 많은 경우)NSString 자체 수정 카테고리 딜레마

@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 

답변

4

옵션 # 2.

NSString은 변경 불가능한 개체를 대상으로합니다. NSString의 모든 표준 "stringBy"메서드는 새로운 자동 변환 된 NSString을 반환합니다.

# 1도 새 NSString을 반환하지만, 의미 상으로는 올바르지 않으며 최악의 경우 변경되지 않은 객체로 간주되는 객체를 변경합니다.

+0

Searching, Comparing, and Sorting Strings를 참조하십시오. 'self'는 멤버 변수가 아니며 간단한 함수 매개 변수입니다. 원하는대로 '자기'를 지정할 수 있으며, 원래 가리키는 대상인 경우 상태를 변경하지 않습니다. – Darren

+0

기술적으로는 작동하지만, 나는 정말 나쁜 형태이며 많은 사람들을 혼란스럽게 할 것이라고 생각합니다. –

+0

'self'에서 컨텍스트를 호출하고 자체 개체를 수정하는 것은 좋은 프로그래밍 습관이 아닙니다. –

0

그래서 이것은 단지 문자열의 전면에서 하나의 편지를 자르면?

NSString은 불변이므로, 성능상의 차이는 없습니다. 첫 번째 경우에는 self를 매번 새로운 문자열 객체로 바꾸고 두 번째 경우에는 매번 returnValue를 새 문자열 객체로 바꿉니다. 첫 번째 옵션은 한 줄의 코드를 저장 했으므로 사용하는 것으로 추측합니다.

4

첫째, 당신의 목표 - C 방법 정의는 C 함수에 정확히 동일합니다 : 당신이 볼 수 있듯이

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

self 그냥 다른 함수 매개 변수입니다; 원하는대로 다시 할당 할 수 있으며 원래 가리키는 원본 NSString * 인스턴스의 상태에는 영향을 미치지 않습니다.

그래서 첫 번째 구현에서 무엇을하고 있는지에 대해 아무런 문제가 없습니다.

그러나, 귀하의 구현도 매우 효율적이며, 모두 버그가 (하나 개 이상의 문자로 접두사를 전달하면 어떻게되는지?)

나는 당신의 접두사를 찾을 rangeOfString:options:range:을 사용하므로 그 ' 최대 하나의 추가 NSString 인스턴스 만 생성합니다.

은 옵션 # 1 아무 잘못이없는, 사실