什么是@private?它的用途是什么?

时间:2011-01-20 06:11:14

标签: objective-c

我在我的一个项目中看到@private这里是代码..

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

这有什么用?

我知道这可能是这个低级问题...我想知道@private在这里的用法。

3 个答案:

答案 0 :(得分:4)

@private限制在@private指令下声明的实例变量的范围或“可见性”。编译器(据称)强制执行此范围,并且不允许在声明them的类之外直接访问私有实例变量。在现代Objective-C运行时(OS X或iOS 4或更高版本上为64位),实例变量不需要在类@interface中声明,并且可见性不是问题。在遗留运行时中,实例变量必须在@interface中声明,因此@private是防止客户端代码直接使用实例变量的唯一方法。

有关详细信息,请参阅Objective-C Language Guide(包括@public@protected@package可见性修饰符。)

GCC没有强制执行可见性,但我相信Clang 2.0会。

答案 1 :(得分:2)

这意味着那些实例变量被认为是类的“私有”,不应该直接访问(这在Obj-C中几乎没有完成,因为它是如此动态,Cocoa为您提供了如此多的免费生成访问器)。所以,这意味着你不能做这样的事情:

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

因为变量是私有的,所以上面应该不起作用(注意编译器实际上现在允许这样做,但是你得到一个警告,有一天它不会...而且我认为clang 2.0编译器实际上可能会生成一个难的错误)。

答案 2 :(得分:1)

@private是一个可见性修饰符。只能在定义的类中查看和使用@private变量。

@public将允许其他类查看和修改此变量。