2011-01-20 2 views
4
내가 여기 코드는 내 프로젝트 @private 중 하나에서 볼

..@private 란 무엇이며 무엇을 사용합니까?

@interface mapview : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate,UITextFieldDelegate> { 
@private 
    CLLocationManager *_locationManager; 
    MKReverseGeocoder *_reverseGeocoder; 
    MKMapView* _mapView; 
} 

이 사용 무엇인가?

나는 이것이 저급 질문일지도 모른다는 것을 알고있다 ... 나는 여기에서 @private의 사용법을 알고 싶다.

답변

4

@private@private 지시어로 선언 된 인스턴스 변수의 범위 또는 "가시성"을 제한합니다. 컴파일러는 (아마도)이 범위를 적용하고 them을 선언 한 클래스 외부에서 전용 인스턴스 변수를 직접 액세스 할 수 없도록합니다. 현대 Objective-C 런타임 (OS X 또는 iOS 4 이상에서 64 비트)에서 인스턴스 변수는 클래스 @interface에 선언 할 필요가 없으며 가시성은 문제가되지 않습니다. 레거시 런타임에서는 @interface에 인스턴스 변수를 선언해야하므로 클라이언트 코드에서 인스턴스 변수를 직접 사용하지 못하도록하는 유일한 방법은 @private입니다.

@public, @protected@package 가시성 수정자를 포함하여 Objective-C Language Guide을 참조하십시오.

GCC에서 가시성을 강화하지는 않지만 Clang 2.0이 가능하다고 생각합니다.

+0

"인스턴스 변수는'@ interface' 클래스에서 선언 할 필요가 없습니다. 속성으로? –

2

이것은 인스턴스 변수가 클래스에 '비공개'로 간주되어 직접 액세스하면 안된다는 것을 의미합니다. (Obj-C에서는 너무 동적이어서 코코아는 많은 무료 생성 접근자를 제공하기 때문에 거의 수행되지 않습니다) . 그래서, 이것은 당신이 이런 식으로 뭔가 할 수 없음을 의미합니다 : 변수가 개인입니다

mapview* myMapView = [[mapview alloc] initWithNibName:nil bundle:nil]; 
CLLocationManager* myMapViewsLocationManager = myMapView->_locationManager; // NO!! 

때문에, 위의 컴파일러는 실제로 순간에이를 수 있습니다 (작동하지 않을해야하지만, 당신은 경고를받을를 그 언젠가는 그렇지 않을 것입니다 ... 그리고 나는 clang 2.0 컴파일러가 실제로 어려운 오류를 생성 할 수 있다고 생각합니다.)

1

@private는 가시성 수정 자입니다. @private 인 변수는 정의 된 클래스 내에서만보고 사용할 수 있습니다.

@public을 사용하면 다른 클래스가이 변수를보고 수정할 수 있습니다.

관련 문제