2010-03-08 6 views
1

정상인가를있는 NSString이되지 않는 이유는 선언의 Obj-C 문자열은 항상 *는 NSString은

NSString c="a sample string"; 

이 작동하지 않을 수 있고,있는 NSString *로 선언해야합니까? 그것은 C++ 문자열과 다릅니다. 맞습니까? 다른 Obj-C 객체로 일반화 할 수 있습니까? 당신이 C++ 문자열 클래스를했고, 전체 데이터 세트보다 포인터없이 만든 경우

+0

이것은 실제로 http://stackoverflow.com/questions/2189212/의 속임수입니다. C++ 트위스트에 대답하려면 예 - NSString과 C 문자열 (".."은 C 문자열)이 다릅니다. 매우 다른; NSString은 객체이고 스택 기반 Objective-C 객체는 지원되지 않으므로 "*"가 필요합니다. – bbum

답변

7

는 목표 - C 객체 (있는 NSString 포함)

+3

글쎄, 변수는 항상 객체에 대한 포인터입니다. 어쨌든 ... 객체 자체는 객체입니다. – geoffspear

0

이도 C에서 적절한 코드 디자인으로 돌아 간다 ++ 항상 포인터이기 때문에 스택에 저장되고, 변수가 복사되면 모든 멤버가 복사됩니다. C++에서 연산자 오버로딩을 통해이 작업을 수행하므로 클래스가 대입 연산자를 재정의하여 클래스의 데이터를 올바르게 복사 할 수 있습니다. 객관적으로 -c 및 정상 c에서는 연산자 오버로드가 없습니다. 그러니까 ... NSString a, b; 그리고 너는 a = b를했다. 메모리에 할당 된 문자열에 대한 포인터가 될 수있는 모든 멤버의 값을 복사합니다. C++에서 문자열 클래스는 할당을 오버로드하여 = b를 수행 할 때 실제로 문자열의 복사본을 b의 데이터에 대한 포인터 대신에 할당합니다. 이것이 중요한 이유는 b의 데이터를 편집하는 것을 상상하는 것입니다. 그러면 부분적으로 업데이트 될 수도 있습니다. 그러나 b에서 변경된 모든 멤버에 따라 업데이트가 반드시 필요하지는 않으며 부분적으로 무효화 될 수 있습니다. 포인터를 매우 강하게 강제함으로써 NSString * a, * b; a = b. 당신은 a가 b에 대한 포인터 일 뿐이며 b가 변경되면 a도 변경된다는 것을 알고 있습니다.