2013-07-31 4 views
1

이것은 어떤 사람들에게는 이상하게 들릴지도 모르지만 .. 나는 단지 이것을 묻기 시작했다. 분명히, 아무도 그것을하고 싶지는 않지만 단지 개념을 만들기 위해서이다. 명확하게, 나는 묻고 싶다. 보통 우리는 다음과 같이 그것을 :이처럼 그것을 할 경우변경 불가능한 클래스로 변경 가능한 객체를 할당하거나 그 반대로

는 는 는
NSString *myString=[[NSString alloc]init]; 
NSString *myString=[NSString string]; 
는 는 지금까지 내가 이해, 그것은 NSString 클래스의 포인터 객체를 제공하지만,

, 무엇을 :

NSString *myString=[[NSMutableString alloc]init]; 
NSString *myString=[NSMutableString string]; 

이 발생하면 , 어떤 종류의 클래스 "문자열"실제로 속한 .. 이후 나는 변경할 수있는 클래스로 초기화했습니다 NSString 클래스의 객체 인 "myString"에 NSMutableString 클래스의 메시지를 보냅니다. ?? 어떤 경우이든 나는이 개념 뒤에 무엇이 있는지를 알 수있다. 또한 이것은 배열, 사전 및 심지어 많은 다른 calsses의 경우에있을 수있다. 두 번째 줄에 어떻게됩니까

답변

2

예. 객체의 유형은 alloc 메소드에서 사용되는 유형입니다. NSMutableString으로 할당 한 경우 객체는 NSMutableString 클래스의 멤버가됩니다. 거기에 무슨

NSString *myString=[[NSMutableString alloc]init]; 

는 컴파일러 인 NSMutableString의 방법을 볼 수 없습니다 당신이 직접 전화를하려고하면 경고를 얻을 것이다, 그래서 그것의 종류에 할당 된 객체에 대한 포인터, 부모 클래스의가 있습니다.

그러나 다시 개체는 여전히 NSMutableString 클래스의 멤버이며 NSMutableString 클래스의 메시지에 응답합니다. 당신은 심지어 명시 적 메소드 호출을 할 수있는 캐스트를 수행 할 수

BOOL test = [myString isKindOfClass:[NSMutableString class]]; //this will hold true 

: 당신이있는 NSString에 대한 포인터로 MyString의 선언에도 불구하고

, 당신은 내가 무슨 말인지 볼이 테스트를 수행 할 수 있습니다.

NSString *myString=[[NSMutableString alloc]init]; 
[(NSMutableString*)myString someNSMutableStringSpecificMethod]; 

추신 :이 가변/불변의 객체에 대한 있지만, 모든 전문화 클래스뿐만 아니라 계산

0

당신이 NSMutableString 객체를 가져이지만, 참조 만하므로 메시지가 NSMutableString 객체에 전송 될 수 기준의 노출 인터페이스에 메시지를 호출 할 수 NSString이지만, 인터페이스 만 NSString에 의해 노출 될 수 있습니다.

[((NSMutableString *)myString) appendString:@"anotherString"] // This works because of the cast 

[myString appendString:@"anotherString"] // Compiler complains because it does not find that method in NSString interface. 

NSMutableString 인터페이스에 의해 노출 된 메시지를 보낼 :

당신은 그러나 언제든지은 예를 들어 NSMutableString으로 캐스팅 할 수 있습니다.