2010-05-21 2 views
0

나는 끔찍한 C 함수를 호출하고 구조체를 되 찾을 수있는 예제를 보았습니다. 여기에는 반복 바 (underbar)가 많이 있습니다.왜 Objective C에서 Objects를 사용하여 내성 검사를 할 수 있습니까?

Money *cost = [[Money alloc] init]; 

    for (Property *property in [[cost class] properties]){ 
    .. 
    } 

    for (Method *method in [[cost class] methods]){ 
    .. 
    } 

:

이유는이 (의사 따를를) 할 수 없다?

+0

OK Rob, 나 자신과 다른 사람들의 모든 의견을 읽었으며 더 많은 설명이 필요하다고 생각합니다. 아마도 여러분은 왜 객체의 모든 메소드 및/또는 속성을 반복 할 수 있어야한다고 생각하는지에 대해 조금 더 설명하고 싶습니까? 정확하게 하나의 유스 케이스를 생각해 볼 수 있습니다. Objective-C 유닛 테스트 프레임 워크를 작성하면서 모든 유닛 테스트 메소드를 찾아야 만 실행할 수있었습니다. – JeremyP

+0

질문에 대한 대답으로 시작하겠습니다. 객체가 실제로 인트로 스펙 션을 지원한다는 것을 알아 냈습니까? 나는 그렇게 생각하지 않는다. 메시지 기반 시스템에서 필수적인 구성 요소라고 생각합니다. OC에 대해 그런 식으로 좋아하기 시작합니다 (아니요, 선호합니다, Java는 btw가 pock이되는 C++의 경향을 개선하기로되어있었습니다). - 포인터 문제가있는 지옥 같은 표식이지만, 지난 10 년 중반의 메트릭스 연구는 결함 밀도가 본질적으로 동일하다는 결론을 내 렸습니다. 그래서 우리는 포인터 지옥 (포인터 지옥 (NPE)의 더 부드러운 형태였습니다). – Rob

+0

소개, 내게는 내부를 의미합니다. Java에서 수행 한 일부 데이터 마이닝 코드의 O-C 구현을 수행하려고했습니다. 저는 제네릭과 리플렉션을 사용하여 차원 척도를 추출하고 계산할 수있었습니다. 내가 제안한 것을 (그와 비슷한 것) 가지고 있다면, 그것은 '사례'를 만들 때 다른 유형을 설명하지 않아도된다는 것을 막을 수 있습니다. (CBR) 이것을 제외하고는 주어진 유형의 객체를 가져와 사례를 출력하는 Factory에서 시작하는 것이 좋습니다. 차선이지만 끔찍한 것은 아닙니다. – Rob

답변

8

이러한 기능은 끔찍하지 않습니다. 그것들은 모두 Objective-C Runtime Reference에 문서화되어 있습니다.

나는 +properties+methods 메서드가 없다고 생각하는 이유 중 하나는 컴파일 타임에 이름을 모르는 속성/메서드를 찾아야하기 때문입니다. ObjC에서

가장 유용한 내성 기능 FromString -respondsToSelector:, -isKindOfClass:, -conformsToProtocol:, NSInvocation, KVC, KVO, NS XXXX이며, 그들은 있다 개체로 동작.

+1

Objective-C 런타임에 대한 링크를 확인 했으므로 NSObject 범주에 Objective-C 메서드를 추가하여 의사가 의사 코드에서 요구하는 것과 정확히 일치하는 작업을 수행하는 것이 상대적으로 쉽습니다. – JeremyP

+0

@Jeremy, 나는 나가 떨어져 나가 나의 포장지를하기 전에 나가 무언가를 놓치고 있지 않았다는 것을 확인하고 싶었다. @Kenny, 나는 그 방법이 문서화되어 있다는 것을 알고 있습니다. 내가 원하거나 필요로하지 않는 것에 관해서는, 나는 당신의 성격에 동의하지 않습니다. Java에서 Reflection을 사용하여 수년간, 나는 여러 차례 클래스에서 속성을 얻는 것을 보았습니다. 그것은 솔직히 전체 아이디어입니다.컴파일 타임에 속성의 이름을 알고 있다면 정적 유형의 클래스를 만들지 않는 이유는 무엇입니까? – Rob

+0

@Rob : 코코아에서 사용 된 모든 델리게이트와 마찬가지로 그 메소드의 구현이 존재하지 않을 수 있기 때문입니다. – kennytm

1

다음은 할 수없는 이유입니다. Cocoa는 런타임보다 상위 레벨에서 작동하기 때문입니다. Objective-C 런타임 함수는 그 위에 구현 된 선택적 라이브러리 인 Cocoa에 합리적으로 의존 할 수 없습니다. 런타임 API 위에 객체 지향 계층을 만들 수는 있지만 이것이 Cocoa의 설계 목표는 아닙니다. 코코아가하는 일을 할 필요는 없습니다.

+0

나는 코코아가 그것을 필요로하지 않는다는 것을 이해한다. 따라서 Windows 프로그래밍에서와 마찬가지로 영속적으로 객체 지향적 인 경우도 있습니다. 객체를 맨 위에 배치하는 절차가 있으며 필요한 객체를 만들지 않은 경우 자체 래퍼를 작성하거나 돌아가는 재미를보아야합니다. 구조화 프로그래밍 시대에 맞추어 – Rob

+0

@Rob : Objective-C는 순수 OO 언어 (Smalltalk)와 구조화 된 절차 언어 (C)의 혼합체입니다. OO 부분은 Java보다 "객체 지향"의 오르간 정의에 더 가깝지만 C가 포함됩니다. Objective-C가 OO 런타임 API를 제공 했더라도 Cocoa 객체가 표준 Objective-C 객체가 아니기 때문에 Cocoa에서 Objective-C를 쉽게 사용할 수 없었습니다. 표준 라이브러리에는 retain/release, alloc/init, performSelector : 등이 포함되지 않습니다. 이러한 외계인 객체에 만족하십니까? – Chuck

+0

@Rob : 요즘까지는 자바 관용구 ("Java"와 "OO"를 동일시 함)를 적절하지 않거나 관용적이지 않은 좀 더 강력한 OO 언어로 번역하려고한다고 생각합니다. – Chuck

0

NSClassDescription을 확인하고 NSObject의 표지 방법을 확인하십시오. 이것은 당신이 찾고있는 것에 가깝습니다.

관련 문제