2009-12-19 4 views

답변

4

개인 인스턴스 변수는 인터페이스를 구현과 분리하는 데 사용됩니다. Objective-C에서 클래스 선언 에 모든 인스턴스 변수를 표시해야하므로 내부 구현의 일부인 서브 클래스에 액세스하지 못하도록하는 방법이 필요합니다. 그렇지 않으면 다른 프로그래머가 내부 변수에 의존하는 코드를 작성할 수 있기 때문에 클래스 디자이너가 기존 코드를 손상시키지 않으면 서 클래스 내부를 변경할 수 없게됩니다.

다른 방법으로 살펴보면 이 아닌이 아닌 인스턴스 변수는 서브 클래스 프로그래머와의 계약의 일부이며 private로 표시된 인스턴스 변수는 그렇지 않습니다.

즉, 인스턴스 변수는 일반적으로 private로 표시되어 액세스 메소드를 통해서만 액세스 할 수 있습니다. 그렇지 않으면 누군가가 클래스의 하위 클래스를 쉽게 작성할 수 있으며 인스턴스 변수를 public으로 만들기위한 접근자를 만들면됩니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 인스턴스 변수를 공개하기위한 서브 클래스 작성에 관해서는'@ private'이 그들을 공개하는 카테고리로부터 보호하지 않는다고 확신합니다. 생각? –

+1

나는 그것을 시험해 보았고, 당신은 절대적으로 옳았다. 범주에는 개인적인 변수를 포함하여 모든 인스턴스 변수에 대한 액세스 권한이 부여 된 것으로 보입니다. 나는 Objective-C가 정말로 당신이 정말로 원한다면 당신을 매달리기에 충분한 로프를 줄 것이라고 생각한다. –

+1

당신은 여전히 ​​런타임 기능을 사용하여 ivar를 얻을 수있다. 그러나 당신이 그런 일을하고 있다면, 당신은 신뢰할 수 있다고 생각한 수퍼 클래스 ivar에 의존하는 순수하지 않은 것과는 달리, 더러운 해킹이라는 것을 알고 있습니다. – Chuck

1

하위 클래스에서 변수에 액세스하지 못하도록하려면 @private로 표시하십시오.

0

@implementation 섹션에서 인스턴스 변수를 선언하는 또 다른 방법이 있습니다. 이러한 변수는 내재적으로 비공개입니다. 출처 : Kochan : Objective-C, 제 4 판 프로그래밍. 피. 그러므로 e.James가 말한 것처럼 클래스 선언이 모든 인스턴스 변수를 보여줘야한다는 것은 사실이 아니다.

@interface에서 인스턴스 변수를 선언하는 유일한 이유는 파생 클래스 (하위 클래스)에 상속 될 수있는 유일한 이유입니다.

+0

앞으로이 작업을 수행하는 올바른 방법은 .m 파일의 클래스 확장에서 선언하는 것입니다. 이것은 개인적인 방법뿐만 아니라 이바라와 속성에도 적용됩니다. 클래스 확장은 이름이없는 카테고리'()'처럼 보이지만 다른 의미와 기능을 가지고 있습니다. – ikuramedia