2014-02-21 1 views
2

두 개의 속성을 선언하는 클래스가 있습니다.읽기 전용 속성이 약한 경우 어떻게 런타임에 확인할 수 있습니까?

@property (nonatomic, readonly, weak) id first; 
@property (nonatomic, weak) id second; 

내가 속성의 속성 확인하기 위해 런타임에 다음 코드를 사용 : 문서에서 분명히

attributes of property are [email protected],R,N,V_first. Weak? 0 
attributes of property are [email protected],W,N,V_second. Weak? 1 

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/objcruntimeguide/articles/ocrtpropertyintrospection.html을에서 : 불행하게도

unsigned int propertyCount; 
objc_property_t *properties = class_copyPropertyList(class, &propertyCount); 
for (int propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) { 
    objc_property_t property = properties[propertyIndex]; 
    const char *rawName = property_getName(property); 
    NSString *propertyName = [NSString stringWithCString:rawName encoding:[NSString defaultCStringEncoding]]; 
    BOOL isWeak = [self propertyIsWeak:property]; 
    char const *attributes = property_getAttributes(property); 
    NSString *attributesString = [NSString stringWithCString:attributes encoding:[NSString defaultCStringEncoding]]; 
    NSArray *attributesArray = [attributesString componentsSeparatedByString:@","]; 
    BOOL weak = [attributesArray containsObject:@"W"]; 
    NSLog(@"attributes of property are %@. Weak? %d", attributesString, weak); 
} 

을, 나는이 결과를 얻을 수 첫 번째 속성에도 'W'가 있어야하지만 그렇지 않습니다. 누구든지이 속성이 실제로 약한 것을 감지하는 방법을 알고 있습니까?

약한 것으로 선언된다는 점에 유의하십시오. 컴파일러는이를 적절하게 취급하고 적절하게 처리합니다.

이것은 버그처럼 보입니다.하지만 실제로 작동하는 방법이 필요합니다.

+4

호기심이 ... 런타임에 이것을 결정해야하는 이유가 무엇입니까? 왜 당신이 확인할 수있는 것이 중요합니까? – Gavin

+0

나는 여기서 W는 쓰기를 의미한다고 생각한다. 나는 읽고 쓰는 것을 의미한다. 약하지 않다 – santhu

+1

@santhu 링크를 방문하면 W가 약자임을 나타냅니다. 그리고 @MicahHainline 나는 이것이 읽기 쉽고 약한 속성을 가질 수 없다고 말하고 있습니다. 어셈블리에서 'first'속성을 확인하고 'weak'이 있거나없는 코드에 차이가 있는지 확인하십시오. – Gavin

답변

1

읽기 전용으로 설정하면 단순히 설정 메소드를 작성하지 않는다는 의미입니다. 따라서 약하게 설정하면 직관적이지 않습니다. 강한/약한 변경자는 합성 된 ivar의 평생 한정자를 변경하는 것 이외의 읽기 전용 속성에 아무런 차이를주지 않습니다.

.h에서 Readonly로 설정하고 약한 변수로 사용하려는 경우 즉, 당신이 원하는 경우하는 .m 파일 내부에

@property (nonatomic, weak) id first 

이는 읽기 전용 외부의 방법이 있지만, 약한 내부 있습니다.

+0

나는 속성을 선언해야하는 것에 관심이 없다. 나는 그것이 무엇인지를 발견하는데에만 관심이있다. –

+1

왜? 즉 그것을 결정함으로써 달성하고자하는 것은 무엇입니까? 내 원래 요점은 당신이 읽기 전용으로 약한 것을 선언하지 않는다는 것입니다. 이렇게하면 문제를 혼란스럽게 만들고 왜 예상치 못한 결과가 나옵니까? 결국 그것이 가리키는 모든 인스턴스가 강하게 존재해야만합니다. – AppHandwerker

+0

원래의 대답을 조금 더 명시 적으로 업데이트했습니다. – AppHandwerker

관련 문제