2016-06-22 3 views
1

다음 코드가 있습니다. aString을 인쇄하면 Goodbye이고 bString을 인쇄하면 Hellworld가됩니다. bString이 aString과 같은 객체를 가리 키지 않아야합니다. 나는 둘다 Goodbye를 인쇄 할 것을 기대한다. 또한 내가 포인터의 메모리 주소를 출력 할 때 그들은 다른 memeory 주소이다. 왜 누군가가 설명 할 수 있습니까?동일한 개체에 대한 포인터 Objective-c

NSString *aString = @"Helloworld"; 
NSString *bString = aString; 

aString = @"Goodbye"; 

나는 bString이 aString과 같은 객체를 가리 키길 원한다. 따라서 aString의 값이 변경되면 bString의 값도 변경되고 그 반대의 경우도 마찬가지입니다. 이것을 어떻게 할 수 있습니까?

+0

bString이 Astring의 최신 값을 기대하는 이유는 무엇입니까? aString은 최신 값을 반환하는 메서드가 아닙니다. –

+0

bString이 aString과 같은 객체를 가리 키길 원합니다. NSString * bString = aString을 쓸 때; bString이 메모리의 같은 객체를 가리 키지 않아야합니까? – James

+0

그 순간입니다. –

답변

4

다음은 코드에서 일어나는 일들을 시각적으로 보여줍니다. 다른 객체에 aString를 가리키는

aString –––––––––> @"Goodbye" @"Helloworld" 
            ^
            | 
bString –––––––––––––––––––––––––––––– 

당신이 볼 수 있듯이

aString –––––––––> @"Helloworld" 
         ^
         | 
bString ––––––––––––––––– 

aString –––––––––> @"Helloworld" 

bString 이미 가리키고있는 객체에 영향을주지 않습니다. 각각 다른 객체를 가리키는 두 개의 포인터로 끝납니다. 당신은, 당신은 프랭클린 말한다 같은 변경할 수 오브젝트 (예 : NSMutableString을 필요 해요 변경할 수 있어야합니다 같은 객체를 가리키는 aStringbString을 갖는 원하는 동작을 달성하기 위해

).

이렇게하면 새 개체를 만들고 가리키는 대신 기본 개체를 돌연변이시킬 수 있습니다. 따라서 aStringbString은 돌연변이 이후 동일한 개체를 가리키고 두 개체가 동일한 값을 볼 수있게합니다.

돌연변이는 단순히 다음과 같을 것입니다 : 당신이 @"" 구문을 사용하여 문자열을 만들 때마다

aString –––––––––> @"Helloworld" 
         ^
         | 
bString ––––––––––––––––– 

aString –––––––––> @"Goodbye" 
         ^
         | 
bString ––––––––––––––––– 
+0

aString을 기반으로 bString을 변경하려면 KVO를 사용해야합니까? –

+1

@TejaNandamuri 만약'aString'이 속성이라면, 값이 언제 바뀌는 지 관찰하기 위해 KVO를 사용할 수 있습니다. 또는 클래스 자체 내에서 이것을 수행한다면 설정자를 단순히 오버라이드 할 수 있습니다. – Hamish

+1

좋은 그래프 버디입니다. 주소 정보보다 쉽게 ​​이해할 수 있습니다. –

3

(또는 어딘가에)

NSString *aString = @"Helloworld"; 
메모리 0x01

문자열 @"Helloworld"이 후; 주소 0x01aString에 할당됩니다.

NSString *bString = aString; 

주소 후 0x01bString에 할당됩니다. 경고!

aString = @"Goodbye"; 

주소 0x01 후 여전히 @"Helloworld"입니다! 이 줄 문자열을 변경하지 않습니다. 새 문자열 @"Goodbye"을 만들고 0x46 (또는 0x01이 아닌 다른 위치)에 저장하고 주소 0x46aString에 할당합니다. 원하는 것을 수행하려면 NSMutableString을 시도하십시오.

참고 : 새로운 NSMutableString을 만들지 마십시오. 현재를 수정하십시오

- (void)setString:(NSString *)aString 
0

1), 프레임 워크가 자동으로 문자열을 캐시합니다. NSString은 매우 특별한 클래스이지만 프레임 워크가 처리합니다. 앱의 여러 곳에서 @"Some String"을 사용하면 모두 메모리의 동일한 주소를 가리 킵니다. -initWithData:encoding과 같은 것을 사용할 때만 문자열이 캐시되지 않습니다.

2) 다른 답변은 -copy을 사용해야한다고 제안했지만 -copy은 수신자가 변경 가능한 경우에만 불변 사본을 만듭니다. (Like NSMutableString) -copy을 불변 개체에 보내면 -retain과 같습니다.

NSString *originalString = @"Some String"; 
NSString *copy = [originalString copy]; 
NSString *mutableCopy = [originalString mutableCopy]; 
NSString *mutableCopyCopy = [mutableCopy copy]; 
NSString *anotherString = [[NSString alloc] initWithString:originalString]; 

originalString, 복사, mutableCopyCopy 및 anotherString가 동일한 메모리 주소에 대한 모든 지점 만 mutableCopy 점은 메모리의 다른 지역을 다할 것입니다.

+0

"프레임 워크"는 "컴파일러"를 의미하고 "캐시 된"은 [문자열 인턴] (https://en.wikipedia.org/wiki/String_interning)을 의미합니다. – Droppy

관련 문제