2014-01-08 2 views
0

나는이목표 C : 그 변수에 대한 모든 포인터는 새 값을 얻을 수 있도록 값을 지정

NSString * a = @"Hello people"; 

같은 변수를 정의 그리고 지금은 그래서 b에 포인터를 복사 상상 모두 A와 B 지점 위치 어디에 @ "안녕하세요 사람들"(오른쪽? 아니면 내가이 어떻게 작동하는지 오해합니까?) 메모리에 저장되어

NSString * b = a; 

지금 나는 또한 새 값으로 업데이트되도록 B를 변경하고 싶습니다. 이 "감사합니다 모두"

b = @"Thanks all!"; 
NSLog(@"%@", a); // still "Hello World" 

하지만 내가 원하는 것은 이다가의 메모리 위치에있는 어떤을 대체 @ 2 새로운있는 NSString에 B를 가리 킵니다 때문에 작동하지 않습니다 다음 @ "안녕하세요 사람들"그래서 그것에 대한 모든 포인터도 업데이트 될 것입니다.

b = ????; 
NSLog(@"%@", a); // Whoa, it still points to the same memory location as b! 

고마워요!

답변

1

이 경우 NSString 대신 NSMutableString을 사용하려고합니다.

NSString이 변경 불가능하기 때문에 원본을 변경하면 완전히 새로운 인스턴스를 가리 킵니다. 그러나 변경 가능한 버전을 사용하면 내용이 변경 되더라도 포인터는 변경되지 않습니다.

그러나이 방법이 효과적 일지는 모르겠지만 좋은 생각입니다. 그러한 변경 가능성은 약합니다. 예를 들어이 속성에 대해 KVO 옵저버가있는 경우 문자열이 변경되면 KVO 알림이 실행되지 않습니다.

이제
NSString **string; 
&string = @"some string"; 

당신이 할 수 있습니다 :

NSString **string2 = string; 

그리고 문자열을 변경 문자열 2로 전파됩니다 때문에

편집

대안은 여러 간접를 사용하는 것입니다 포인터가 같더라도 포인터가 가리키는 객체가 변경됩니다. Hovewever, 당신은 포인터를 사용하는 역 참조해야합니다

, 즉

NSLog (@"String is: %@", *string); 

또는

NSLog (@String2 is: %@, *string2); 

하지만 당신은 여전히 ​​가변성 문제가 있습니다.

+0

괜찮습니다. 하지만 일반적으로 메모리 위치를 다른 것으로 바꿀 수 있어야합니다. 맞습니까? 또는 한 번에 위치 X에서 위치 Y까지 모든 포인터를 업데이트 할 수 있습니까? 그게 아무것도 아닌가요? –

+0

그러나 메모리 조각을 바꾸려면 그 위치의 어떤 점을 알 필요가 없습니다. 맞습니까? NSDate를 현재 시간으로 업데이트하려고합니다. 내가한다면 b = [NSDate new]; 그건 효과가 없을거야. 그러나 어떻게해야합니까? :-) –

+0

@WillemMulder 지난 코멘트를 삭제하고 내 대답을 다른 옵션으로 업데이트했습니다. – Abizern

관련 문제