2012-03-10 2 views
0

이전 질문에서, 모든 Objective-C 객체가 포인터로 선언되었다는 것을 알아 냈습니다. 그러나 C와 C++에서 포인터는 전역 함수가 아닌 모든 함수에서 액세스 할 수 있으며 보호되지 않는 것처럼 보입니다.Objective-C 객체는 어떻게 보호됩니까?

어떻게 Objective-C에서 "보호"됩니까?

+1

너 무슨 소리 야? 예제를 추가하십시오. "포인터는 모든 기능에서 액세스 할 수 있습니다."는 나에게 많은 의미를 부여하지 않습니다. – delnan

+2

개체는 어떤 언어로도 보호되지 않습니다 *. C++에서도 'private'및 'protected'멤버가 있으므로 개체에 대한 오프셋을 해결할 수 있으면 개체 외부의 코드에서이 멤버에 액세스 할 수 있습니다. – trojanfoe

+2

어떤 종류의 보호를 원하십니까? 프로그래머 뒤에 총을두고 "당신은 그 포인터에 접근하지 않을거야!"라고 외치는 경비원. 또는 무엇을 ... –

답변

2

ObjC는 포인터 사용에 대해 경고하지 않습니다.

컴파일시 유형 검사가 있으므로 NSNumber에 대한 포인터가 있고이 변수를 보유하는 변수를 사용하여 NSString에 할당하면 컴파일러에서 경고를 표시합니다. 아래 그림과 같이 그러나이 쉽게이 경우

NSNumber *myNumberPtr = [NSNumber initWithInt:99]; 

NSString *myStringPtr = (NSString *) myNumberPtr; 

, 포인터를 캐스팅에 의해 무시되고, 컴파일러는 조용히하라고하지만, 문자열로 myStringPtr를 액세스하는 '정의되지 않은 결과', 분명 희망이 뭔가를 야기 충돌처럼,하지만 아마도 더 무언가가 더 위험합니다. 마찬가지로

, 내가 선언 할 수

NSString *notActuallyAString = 0x897996789; // assigned some random value 

notActuallyAString 런타임에 액세스 할 때 포인터가 NSString를 가리키는 거의 확실하지 않다 그런 다음, 그것은 잘못된 액세스 예외가 발생할 가능성이 highy이며, 아마도 유효한 메모리 주소가 아닙니다.

이렇게하면 C (및 관련 언어)가 저수준 프로그래밍에 강력 해집니다 (실제로 일부 하드웨어 레지스터의 메모리 매핑 주소를 알고 이러한 방식으로 할당하고 하드웨어에 액세스하는 경우) 위험.

실행 중 어떤 시점에서 유효한 포인터가있을 수 있기 때문에 상황이 악화되지만 포인터가 참조하는 메모리는 나중에 나중에 해제됩니다. 그런 다음 (잘못) 포인터에 액세스하면 코드가 가정하는 목적으로 메모리가 더 이상 유효하지 않으므로 다시 예외가 발생할 수 있습니다. 포인터를 통해 포인터를 통해 어딘가에 그것을 쓰지 않아야한다. (메모리 할당은 메모리 손상의 일반적인 원인이다.) 진단 할 악마가 될 수있다. 이런 이유로, 완료 한 포인터가 nil에 할당되도록하는 것이 좋습니다 (방어 코딩). 따라서 포인터를 다시 사용해야하는 경우 진단하기가 더 쉽습니다. 임의의 메모리 손상보다.

objC에서 프로그램하기위한 포인터를 잘 이해하고 있어야하며, Kernighan & Ritchie의 영원한 고전 참고 서적 'The C Programming Language'를 읽는 것이 좋습니다. 포인터의 기초를 설명하고 이해를 도울 수 있습니다. 포인터와 메모리 할당이 ObjC와 C++에서 어떻게 사용되는지에 관한 정보.

+0

내가 볼 수있는 "보호"는 여기에 포인터가받을 수있는 것만 수신 할 수 있다는 것입니다. 독서 조언을 주셔서 감사합니다. 하지만 5 월 이전에 강의 과정을 적어도 15 회 끝내야합니다. 그래서 내가 원하는 것을 정확히 얻어야합니다. 그래서 Google에서 검색 했으니 까, 찾지 못했습니다. :) – TheNavigat

+0

유일한 보호 책은에서 컴파일러 경고입니다. 빌드 시간, 그러나 이것은 진정한 메모리 보호가 아닙니다. 경고는 포인터가 참조하는 유형에 대해서만 액세스해야한다는 것입니다. – Snips

1

포인터 자체에는 아무런 보호 장치가 없습니다.

OOP의 몇 가지 기본 사항을 살펴보아야합니다. 구성원은 공개, 보호 또는 개인의 세 가지 유형이 될 수 있습니다. 이것은 클래스 자체의 구현 외부에서 멤버에 액세스 할 수 있는지 결정합니다 (물론 객체의 바이트를 직접 수정하는 개인 멤버에 액세스하는 것과 같은 해킹을 고려하지 않습니다.) 이는 OO 철학에 강하게 부각되기 때문입니다. 회원이 개인이 인 경우 이유는이며 액세스를 강요해도 라이브러리의 다른 버전이나 다른 컴퓨터에서 작동한다는 보장이 없습니다.

Objective-C 멤버는 기본적으로 보호되어 있습니다.그것이 당신이 찾고있는 보호를주는 것입니다.

0

Objective-C에서 인스턴스 변수는 기본적으로 노출되지 않습니다. Objective-C 2.0에서는 @property@synthesize 구문을 사용하는 속성에 의해 노출됩니다. (2.0 이전에는 명시 적으로 작성된 getter/setter 메서드 만 사용)

그럼에도 불구하고 포인터 연산자 구문을 사용하여 인스턴스 변수에 직접 액세스 할 수 있습니다. text이 속성으로 노출되지 않은 경우에도 NSString *bar = Foo->_text;입니다.

또한 인스턴스 파일을 공용 헤더 파일에 노출시키지 않도록 구현 파일에서 인스턴스 변수를 선언 할 수 있습니다. 프레임 워크 코드를 작성하는 경우, 이것은 더 이상 볼 수 없기 때문에 속성 접근 자 외부의 이바라기에 대한 액세스에 대한 '보호'를 제공합니다.