我在我的一个项目中看到@private这里是代码..
@interface mapview : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate,UITextFieldDelegate> {
@private
CLLocationManager *_locationManager;
MKReverseGeocoder *_reverseGeocoder;
MKMapView* _mapView;
}
这有什么用?
我知道这可能是这个低级问题...我想知道@private在这里的用法。
答案 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将允许其他类查看和修改此变量。