2011-01-20 40 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!! 

変数がプライベートであるため、上記の動作してはならない(コンパイラが実際に現時点でこれを可能にしていますが、その警告を受けることに注意してくださいいつかそれは...と私はクラング2.0コンパイラは、実際には難しいエラーを生成することができると思う)。

1

@privateは可視性変更子です。 @privateである変数は、定義されているクラス内でしか見ることができません。

@publicこの変数を他のクラスで表示および変更できるようにします。

関連する問題