2012-05-10 3 views
0

저는 프로젝트에서 KVC를 사용합니다.KVC valueForKey 대신 __NSCFConstantString을 반환합니다.

@property (nonatomic, strong)    NSString   *notes; 

내가 해당 속성에있는 NSString 객체를 넣을 :

그리고, 내 클래스 중 하나에, 나는 재산 쓴

그리고 값을 설정하기 전에를, 나는 검사 할 목적지의 클래스 명.

a = [ newContainer valueForKey:@"notes"]; 
if(a != nil && ![ b isKindOfClass:[ a class ] ]) 

// here b is the new NSString value 

그 결과 xcode는 클래스가 동일하지 않음을 나타냅니다.

(gdb) po [ b class ] 
__NSCFString 

(gdb) po [ a class ] 
__NSCFConstantString 

나는 그다지 중요하지 않으며 __NSCFConstantString은 NSString의 개인 하위 클래스라는 것을 읽었습니다.

하지만 제 경우에는 객체를 업데이트하기 전에 객체의 모든 속성을 검사해야합니다.

그리고 난 내 코드에서 가지고 싶지 않아 :

// OK, classes aren't the same ... 
// ---- BUT WE MUST test it again to know if a is a NSString and b a subclass of NSString or anything else ... 

beurk!

누구나 동일한 문제가 있습니까?

도움을 주셔서 감사합니다.

답변

0

3 점 :하지 귀하의 재산의 현재 값의 클래스에 대한

1 당신은 [는 NSString 클래스]에 대해 확인해야합니다, 당신의 재산의 공개적 노출 클래스.

속성 클래스 대신 값 클래스를 검사하면 어떻게되는지 상상해보십시오. 속성을 NSString의 완벽한 인스턴스 인 NSMutableString으로 설정 한 후에는 더 이상 일반 NSString으로 설정할 수 없습니다 (이후 NSString은 NSMutableString의 하위 클래스가 아닙니다.) 현재의 문제는이 단락에서 설명한 것과 유사하며 이해하기 쉽습니다.

2- 테스트는 지금하고있는 것처럼 외부가 아니라 속성을 소유하는 클래스에서 수행해야합니다. 그 클래스만이 받아들이는 객체의 유형을 알 수 있습니다.

3-so. 표준 validateValue : forKey : error : 메서드를 사용하십시오.이 메서드는 여러분의 친구입니다. 이 메소드는 클래스에 의해 구현되며 노트가 NSString인지 확인합니다. 클래스 외부에서는 값의 유형을 직접 확인하지 않지만 컨테이너 클래스에 유효성을 검사하도록 요청합니다.

그리고 voilà!

관련 문제