2009-10-16 5 views
3

공용 머리글에서목표 -C : 개인이 아닌 것은 무엇인가?

@interface ViewController : UIViewController 
{ 
@private 
    UIButton* button_; 
} 

@private 선언을 사용하는 사람들이 왜 그렇습니까? 구현 내에서 변수를 선언하면 동일한 결과가 나타납니다. 그렇습니까? 나에게는 이상한 느낌이 들었습니다. 공개 머리글에는 공개 된 멤버 만 포함되어야한다고 생각했습니다. 보호 된 회원들과해야 할 일?

@implementation ViewController 
    UIButton* button_; 
@end 

내가 아는 유일한 차이점은이 변수는 현재 컴파일 단위 (.m 파일, 오른쪽?) 밖에 볼 수 없다는 것입니다.

메소드가 동일하게 유지됩니까? 나는 적절한 방법으로 명령을 컴파일하거나 선언을 전달하여 잘 컴파일 할 수있다. 왜 사람들은 사적 방법을위한 범주를 선언하는 것을 신경 쓰는가? 테스트 목적으로 만 사용 하시겠습니까?

답변

7

블록 내의 변수 선언은 인스턴스 변수가 아닌 전역 변수를 만듭니다. 인스턴스 변수는 @interface의 일부로 정의해야합니다.

@interface 블록을 범주 또는 확장을 사용하여 만들 수 있지만 인스턴스 변수가 아닌 메서드 선언 만 포함 할 수 있습니다.

+0

그게 내가 기대하는 것이 아니다! 그것은 또한 정적이라는 것을 의미합니까? –

+0

필자는 그렇지 않다고 생각합니다. 이는 선언하는 'C'방식의 전역 변수 일뿐입니다. 'Objective-C'는'C'의 엄격한 수퍼 세트이므로 모든'C' 규칙이 여전히 적용된다는 것을 기억하십시오. – pgb

+0

나는 이것이 글로벌 변수라는 것을 확인했다. 난 비 정적 변수 _inside_ @implementation을 선언 할 때 컴파일러가 경고를 발행하지 않습니다 놀랍군요 –

0

@private는 iVars만을 참조합니다.

기본적으로 당신과 같이 인스턴스의 인스턴스 변수에 액세스 할 수 있습니다 : - id iShouldNotDoThis = foo->bar;

@private 당신이 그 같은 바르에 액세스하고 액세스 방법을 사용할 필요가 없음을 의미합니다.

id thisIsBetter = [foo bar]; 

개인 범주 또는 방법과 관련이 없습니다.

+0

구현 파일 안에 선언 된 경우 button_에 액세스하려고하면 컴파일러/링커 오류가 발생하지 않습니까? –

+0

구현 파일에 없습니다. 공용 헤더에 있습니다. @private로 선언했습니다. –

+0

죄송합니다. 내 예제 aboce를 의미합니다. 여기서 button_은 구현 파일로 선언되었습니다. –

4

개인 인스턴스 변수를 공용 헤더에 넣는 것이 "잘못 될 수 있지만"걱정하지 않겠다.

Cocoa 클래스의 헤더 파일 (클러스터 클래스 제외)을 살펴보면 Apple이 공용 헤더 파일에 인스턴스 변수를 선언한다는 것을 알 수 있습니다.

Apple은 문제가 없으므로 걱정할 필요가 없습니다. =)

FYI : 모든 인스턴스 변수는 기본적으로 보호됩니다.

3

방법에 대해 동일한 내용이 적용됩니까?

아니요, 메소드는 프로그램의 일부에서 볼 수 있습니다. 선택기를 알고 있으면 호출 할 수 있습니다.

올바른 방법으로 순서를 지정하거나 선언을 전달하여 올바르게 컴파일 할 수 있습니다. 왜 사람들은 사적 방법을위한 범주를 선언하는 것을 신경 쓰는가? 테스트 목적으로 만 사용 하시겠습니까?

개인 범주는 전달 선언 형식입니다. 마치 C 프로토 타입 인 것처럼 생각할 수 있습니다.

Andrew