Objective-C中“@private”是什么意思?

Objective-C中@private是什么意思?

这是一个可见性修饰符 – 这意味着声明为@private实例variables只能由相同类的实例访问。 私人成员不能被子类或其他类访问。

例如:

 @interface MyClass : NSObject { @private int someVar; // Can only be accessed by instances of MyClass @public int aPublicVar; // Can be accessed by any object } @end 

另外,为了澄清,在Objective-C中方法总是公开的。 有一些方法可以“隐藏”方法声明,但请参阅这个问题以获取更多信息。

正如所说,这是一个可见性修改。 @private意味着ivar(实例variables)只能从同一个类的实例中直接访问。 但是,这对你来说可能没有多大意义,所以让我举个例子。 为了简单起见,我们将使用类的init方法作为示例。 我会在内部发表评论以指出感兴趣的项目。

 @interface MyFirstClass : NSObject { @public int publicNumber; @protected // Protected is the default char protectedLetter; @private BOOL privateBool; } @end @implementation MyFirstClass - (id)init { if (self = [super init]) { publicNumber = 3; protectedLetter = 'Q'; privateBool = NO; } return self; } @end 

 @interface MySecondClass : MyFirstClass // Note the inheritance { @private double secondClassCitizen; } @end @implementation MySecondClass - (id)init { if (self = [super init]) { // We can access publicNumber because it's public; // ANYONE can access it. publicNumber = 5; // We can access protectedLetter because it's protected // and it is declared by a superclass; @protected variables // are available to subclasses. protectedLetter = 'z'; // We can't access privateBool because it's private; // only methods of the class that declared privateBool // can use it privateBool = NO; // COMPILER ERROR HERE // We can access secondClassCitizen directly because we // declared it; even though it's private, we can get it. secondClassCitizen = 5.2; } return self; } 

 @interface SomeOtherClass : NSObject { MySecondClass *other; } @end @implementation SomeOtherClass - (id)init { if (self = [super init]) { other = [[MySecondClass alloc] init]; // Neither MyFirstClass nor MySecondClass provided any // accessor methods, so if we're going to access any ivars // we'll have to do it directly, like this: other->publicNumber = 42; // If we try to use direct access on any other ivars, // the compiler won't let us other->protectedLetter = 'M'; // COMPILER ERROR HERE other->privateBool = YES; // COMPILER ERROR HERE other->secondClassCitizen = 1.2; // COMPILER ERROR HERE } return self; } 

因此,要回答你的问题,@私人保护ivars由任何其他类的实例访问。 请注意,MyFirstClass的两个实例可以直接访问所有对方的ivars; 假设程序员直接对这个类完全控制,他会明智地使用这个能力。

当有人说你不能访问@private实例variables时,理解它意味着什么是很重要的。 真实的情况是,如果你试图在源代码中访问这些variables,编译器会给你一个错误。 在以前的GCC和XCode版本中,您只会得到一个警告而不是一个错误。

无论哪种方式,在运行时,所有投注都closures。 这些@protected私有和@protected ivars可以被任何类的对象访问。 这些可见性修饰符使得难以将源代码编译成违反可见性修饰符意图的机器代码。

不要依靠伊娃可见性修饰符的安全性! 他们根本没有提供。 他们严格按照build造商的意愿进行编译。