2010-01-19 6 views
5

이과에서 경고하는 것은 작동합니다코코아는 : 인 NSMutableString은 stringValue

NSString *myVar = @"whatever"; 

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"]; 

myVar = [myNum stringValue]; 
가변 문자열이 버전은 "뚜렷한 목표 - C 타입에서 지정"경고 생산하고

: 두 경우의 stringValue에서

NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"]; //UPDATE: CORRECTED CODE 

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"]; 

myVar = [myNum stringValue]; 

을 반환 NSCFString. 변경할 수없는 NSString 변수는 신경 쓰지 않고 변경할 수있는 NSMutableString은 불평합니다.

P. 누군가 NSMutableString 및 stringValue에 대한 태그를 추가하십시오.

+0

경고를 게시 할 수 있습니까? –

+0

(아, 내가 아직 쿠키를 사용하고 있기 때문에 의견을 게시 할 수 있습니다 ...). Laurent, 노란색 Xcode 경고입니다 : "경고 : 고유 한 Objective-C 유형에서 할당". – StringSection

+0

Phillipe와 Vladimir의 답변으로 상황이 설명되었습니다. 문제는 stringValue 객체가 변경할 수 없으므로 변경할 수있는 문자열 변수에 할당 할 수 없다는 것입니다. (블라디미르는 또한 내 NSMutableString * myVar = @ "무엇이든"; 코드는 본질적으로 불법이지만 문제의 경고를 작성하지 않음을 지적합니다.) 감사합니다! – StringSection

답변

6

-stringValue은 변경할 수없는 객체 인 NSString의 자동 반복 인스턴스를 반환합니다. 당신은 가변 문자열에 할당하더라도 그것이 문자열이 변경 가능하지 않습니다 포인터 당신은 (BTW, 같은 귀하의 첫 번째 코드에 대한 진정한 유지) 그것에 가변 문자열 메쏘드를 호출 할 수 없습니다 :

NSMutableString* tStr = @"lala"; 
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object 

그것을 처리하는 올바른 방법은적이고 전통적인 방법으로 변경할 문자열을 생성하는 것입니다 :

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"]; 
[tStr appendString:@"lalala"]; // OK 
+2

또는'[aString mutableCopy]'를 사용할 수 있습니다. –

+0

블라디미르 (Vladimir)의 의견에 따르면 처음 작성된 적절한 NSMutableString을 보여주기 위해 원래 게시물의 코드를 수정했습니다. – StringSection

+0

같은 문자열을 지정할 때 : myVar = [myNum stringValue]; 이전의 모든 과제를 무시합니다. 이전에 문자열을 작성한 방법과 상관없이 myVar에 -stringValue 결과가 포함되어 이전 값이 손실됩니다. – Vladimir

4

가 [myNum에 stringValue]는있는 NSString,하지 인 NSMutableString을 반환합니다, 그래서 이것은 경고를 생성합니다.

나중에 변경할 수있는 문자열 인 myVar의 인스턴스를 조작하려고하면 객체가 변경 가능한 문자열이 아니기 때문에 예외가 발생합니다.

0

변경 가능한 문자열을 NSMutableString * 유형의 변수에 할당하기 만하면 변경할 수없는 문자열을 변경할 수 없습니다. 당신이하는 일은 본질적으로 : 정확히 같은 상수 문자열 객체에이 경우 포인트

NSString *immutableStr = @"Mayonnaise"; 
NSMutableString *mutableStr = immutableStr; 

두 변수 (포인터가 동일한 비교합니다). 유형 NSMutableString *의 변수를 호환 가능하지 않은 값이 NSString *으로 설정하려고 시도하기 때문에 경고 메시지가 나타납니다. NSMutableString *NSString *이없는 메서드와 동작을 제공하므로 호환되지 않습니다. 따라서 NSMutableString의 동작을 사용하려고하면 변수가 가리키는 실제 개체가 NSMutableString이 아니기 때문에 런타임 오류가 발생합니다.

관련 문제