2012-06-15 5 views
4

NSStringNSMutable 문자열 사용 사이에 혼란 스럽습니다. 은 가정하자 나는이 같은 클래스에서 선언 된 인스턴스 변수 하나, 둘 있습니다NSMutableString 대 NSString의 사용?

NSString *one; 
NSMutableString *two; 

우리가 내가 만든 세터와 속성을 사용하여의 게터가 있다고 가정하자.

 1. [two appendString:@"more string"]; 
    2. two = @"string" 
    3. self.two = @"string" 

질문 :

  1. 것 1 라인 출시 이전 문자열을 새로운 객체를 할당하고 여기에 값을 할당

    내가이처럼 내 "이"문자열을 변경 말할 수 있습니다. 그렇다면 그렇다면 Getter 및 Setter를 만드는 것은이 경우에 불필요한 것입니까? 또는 속성을 생성 할 필요가 없습니다. NSMutablestring

  2. 이 경우 이전에 할당 된 문자열 개체가 해제됩니까?

  3. 우리가 여기서 setter를 호출 할 때 첫 번째 객체가 해제 될 것입니다. 이 코드가 필요하거나 코드 줄 2를 사용하여 문자열을 지정할 수 있습니다.

자에 대한 NSString : NSMutablestring 또는 NSString를 사용하여 더 나은

one = [one stringByAppendingString:@" more string"]; 
    self.one = [one stringByAppendingString:@" more string"]; 

: 으로는이 같은 문자열을 수정할 수 있습니다?

오랫동안 미안하지만 이러한 개념을 이해해야했습니다. 질문의 첫 번째 부분에 대한

답변

3

:

거의 확실히
  1. 없습니다. 나는 메모리가 해제되고 재 할당되기보다는 동적으로 할당 될 것으로 기대한다.

  2. 이전 대답이 아니오 인 경우이 또한 아니오입니다.

  3. 두 번째와 세 번째 옵션도 Incompatible pointer types assigning NSMutableString to NSString

난 당신이 일찍에 표시 될 때 메모리의 측면에서 약간 더 효율적입니다 NSMutableString을 기대 경고와 함께 작동하지 않는 메모리를 필요로 할 수 프로그램 동적으로 NSString에는 적절한 크기의 단일 메모리 블록이 할당 될 가능성이 높습니다.

NSStringstringBy... 방법으로

, 당신은 새로운 객체를 생성 예전를 (필요가있을 경우) 해제하고 새로운하고 있습니다 : NSMutableString

귀하의 전망이있는 NSString의 stringBy.. 방법이 무엇을 할 것 인 것 같다 객체 autorelease.비 자동 릴리즈에서 자동 해제로 변경하는 경우 dealloc에 ​​더 이상 필요하지 않은 릴리즈가있을 수 있습니다.

+0

정말 좋은 통찰력. 하나의 Ques : NSString에서 stringBy 메서드를 사용하고 메모리가 런타임 자체로 관리되는 경우 NSString의 속성을 만들어야합니까? 이 경우 등록 정보 생성 작업이 불필요합니까? – user1374408

+0

어떤 속성을 만들려고합니까? –

+0

nonatomic, retain – user1374408

2

NSMutableStringNSString은 항상 상수이기 때문에 메모리가 절약됩니다. 따라서 새로운 값을 NSString 변수에 재 할당하면 새 문자열에 대해 새 메모리가 할당됩니다.

그러나 코드에 몇 가지 오류가 있음을 유의하십시오. 당신은 그들에게 메시지를 전송하기 전에 개체를 초기화해야합니다 :

// this won't work 
NSString *one; 
[one stringByAppendingString:@"more string"]; 

// nor this 
NSMutableString *two; 
[two appendString:@"more string"]; 

// first do this: 
NSString *one = @"an initial string constant"; // or 
NSString *one = [NSString string]; 

NSMutableString *two = [NSMutableString string]; 
+1

미안하다고 생각합니다. 하지만 그 부분은 코드를 생략하여 문자열을 수정하는 것과 관련되어 있었고 그 부분을 추측 할 수 있다고 생각했습니다. – user1374408

2

NSString 객체는 불변이 당신이 NSString를 "수정"할 때 사실에 있는지를하지 않은 이전을 새로운 문자열을 생성하고 수정하지 의미 매우 효과적입니다. NSMutableString으로 문자열은 수정할 수있는 것보다 버퍼에 보관됩니다.

간단한 규칙은 어떤 식 으로든 문자열을 수정해야 할 경우 NSMutableString을 사용하고 그렇지 않으면 NSString을 사용하는 것입니다. NSMutableStringNSString으로 캐스팅 할 수도 있지만 그 반대의 경우는 복사 할 필요가 없습니다.

+0

나는 이해한다.그러나 내면의 일을 이해하고 싶었고 실제 적용을 이해하지 않고 규칙을 배우기를 원했습니다. 어쨌든, 고마워! – user1374408

+0

NSMutableString을 수정할 수 있고 NSString을 사용할 수 없다면 왜 NSString을 사용해야할까요? NSString은 NSMutableString보다 몇가지 장점이 있습니까? –

3

NSString은 초기화 후에 변경할 수없는 문자열 개체입니다. NSMutableString은 변경할 수 있습니다. 다른 문자열을 추가하거나 다른 수정 사항을 추가 할 수 있음을 의미합니다.

[two appendString:@"more string"] 때 포인터는 여전히 메모리의 동일한 위치를 가리키며 할당 또는 할당 해제에 대해 걱정할 필요가 없습니다.

two = @"string"을 수행하면 문자열 포인터가 값이 "string"인 정적 문자열이 들어있는 메모리의 특정 위치를 가리키는 것을 의미합니다.

self.two = @"string"을 할 때 이미 2 개의 선언 된 속성이 있습니다. xcode에서 속성을 사용하면 속성 선언에 이미 지정했기 때문에 메모리에 대해 걱정할 필요가 없습니다. xcode가 제공하는 멋진 도구이며 가능할 때마다 확실히 사용해야합니다.

인 NSMutableString :있는 NSString하지 않지만 인 NSMutableString 물체가 그들이 나타내는 문자의 기본 배열을 수정하는 방법을 제공

+0

다른 단어 : ARC를 사용하면 NSString 클래스를 모두 사용할 수 있으며 걱정하지 않아도되지만 잠시 동안 (동적 문자열이 많은 동적 셀과 같은) 메모리를 절약 할 수있는 곳에서는 NSMutableString을 사용해야합니다. –

0

인 NSMutableString하고있는 NSString 간의 차이이다. 예를 들어, NSMutableString은 appendString, deleteCharactersInRange, insertString, replaceOccurencesWithString 등과 같은 메소드를 노출합니다. 이러한 모든 메소드는 메모리에 존재하는대로 문자열에서 작동합니다. 런타임에 문자열 object valsue를 변경할 수 있습니다.

NSString : 반면에 NSString은 사용자가 원한다면 작성 후 한 번만 읽기 전용 문자열입니다. 모든 "조작"메소드 (substring, uppercaseString 등)가 다른 NSString 객체를 반환하고 실제로 메모리의 기존 문자열을 수정하지 않는다는 것을 알 수 있습니다.