2009-09-05 5 views
5

무슨 차이 :목적 C - 정적 멤버와 상수

@interface SomeClass : NSObject { 
    NSObject *something; 
} 

@interface SomeClass : NSObject { 

} 
NSObject *something; 

? 또한 Java의 최종과 목표 C (C)의 const 사이의 차이점은 무엇입니까? 그리고 다음 상황에서 정적 클래스 멤버를 선언해야합니다 : 1. 클래스에만 필요하면 ** ** 2. ** 다른 클래스에서 읽을 수있는 속성은 어디에 있습니까? 나는 이미 #define에 대해 알고 있지만 매번 새로운 것을 생성하기 때문에 객체에 좋지 않습니다. 감사!

답변

7

전자는 인스턴스 변수이며 SomeClass의 각 인스턴스에 대해 something을 만듭니다. C와 비슷합니다

typedef struct { 
    NSObject *something; 
} SomeClass; 

후자는 SomeClass와 실제 연결이없는 전역 변수를 선언합니다. C에서는 전역 범위에서 정의한

NSObject *something; 

과 동일합니다. Objective-C에는 클래스 변수가 없으므로 전역 변수가 사용됩니다 (오히려 가끔 사용되며 compilation unit 범위의 변수 및 정적 storage class이 사용되어야합니다).

"클래스"변수를 정의하는 가장 깨끗한 방법은 구현 파일에 정적 변수를 정의하는 것입니다. 그렇게하면 클래스 메서드 만이 메서드에 액세스 할 수 있으므로 전역 네임 스페이스가 오염되는 것을 방지 할 수 있습니다. 공개적으로 사용할 수있게하려면 접근자를 정의하십시오.

클래스 변수를 올바르게 파기하는 것은 어렵습니다. 응용 프로그램이 종료되면 메모리가 다시 확보되고 열린 파일이 자동으로 닫히지 만 다른 리소스는 너무 잘 처리되지 않을 수 있습니다.

2

"final vs const"질문에 대해서는 둘 다 비슷합니다. 그들은 가치가 변할 수 없다고 진술한다. Java에서 모든 값 (기본 요소 제외)은 포인터이므로 포인터가 가리키는 객체는 바뀔 수 있지만 메모리 위치 (포인터)는 절대로 변경되지 않습니다. 나는 당신이 Objective C에서 비슷한 동작을 기대할 것이라고 믿는다. 그리고 항상 객체 내부의 값을 여전히 수정할 수 있기 때문에 변경 가능한 요소가 "final"또는 "const"인 것을 허용하지 않는 것이 좋다.

+0

"final"은 const 포인터 (" const *'")에 대한 포인터가 아니라 const 포인터 (" * const'")와 비슷합니다. 또한 C++의 참조 유형 (" &'")과 매우 비슷합니다. – outis

+0

해명 해 주셔서 감사합니다 - 나는 항상 특별한 경우를 혼동합니다 :) – aperkins

+0

혼란 스럽다면 http://www.strainu.ro/programming/c/a-little-fun-with-cdecl/을 확인하십시오. – outis