Is it possible to declare a method as private in Objective-C?
是否可以在Objective-C中将方法声明为私有?
如果您使用的是Objective-c 2.0,那么创建其他人难以调用的方法的最佳方法是将它们放入类扩展中。假设你有
1 2 3 4 5 6 7 | @interface MyClass : NSObject { } - (id)aPublicMethod; @end |
在
1 2 3 4 5 6 7 8 | @interface MyClass () //note the empty category name - (id)aPrivateMethod; @end @implementation MyClass - (id)aPublicMethod {...} - (id)aPrivateMethod {...} //extension method implemented in class implementation block @end |
类扩展的优点是"扩展"方法在原始类体中实现。因此,您不必担心方法实现在哪个
正如其他人指出的那样,Objective-C运行时不会强制实现方法的私密性(即使没有源代码,也不难发现那些方法使用的是类转储),但是如果有人试图调用它们,编译器会生成一个警告。一般来说,objc社区接受一个"我告诉过你不要调用这个方法[把它放在一个私有类扩展或类别中,或者仅仅通过记录这个方法是私有的],你无论如何都会调用它。无论发生什么混乱,都是你的错。别傻了。"对待这个问题的态度。
没有什么可以阻止方法被调用(因为objective-c是基于消息的,所以任何消息都可以发送),但是您可以在头之外声明它们,使它们不可见,并且编译器将在使用时生成警告。
这对类和实例方法都有效。
例如。
1 2 3 4 5 6 7 | #import"SomeClass.h" // Interface for hidden methods @interface SomeClass (hidden) +(void) hiddenClassMethod; -(void) hiddenInstanceMethod; @end |
注意:不要这样声明变量,否则它们将成为类变量-例如,所有实例只使用一个变量。
不,任何对象都可以向任何其他对象发送任何消息。但是,您可以将该方法放在属于类实现文件一部分的类别中。这样,如果您尝试在其他任何地方调用它,就会得到"类可能无法实现此方法"警告。这是使方法"私有"的正常方法。
实现隐藏方法(实例和/或类)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // =========================== // = File: SomeClass.m // =========================== #import"SomeClass.h" // ================================= // = Interface for hidden methods // ================================= @interface SomeClass (hidden) -(void) hiddenInstanceMethod; @end // ================================ // = Implementation for SomeClass // ================================ @implementation SomeClass -(void) hiddenInstanceMethod { printf("Hidden instance method " ); } -(void) msg { printf("Inside msg()... "); [self hiddenInstanceMethod];//private method calling } @end |
http://macdevelopertips.com/objective-c/private-methods.html
重新访问此链接将有所帮助。
正如其他人提到的,您不能拥有
人们已经指出,您可以放弃第2点,得到一个很难但不可能调用的方法。或者,为什么不放弃第1点?
现在只能从同一个文件中调用代码。您没有任何可以通过方法获得的神奇的私有成员访问权,因此这决不是一个完美的解决方案。但是没有更好的方法来实现隐私。
你可以通过分类来做到这一点。我对这个问题的答案有更详尽的描述。
如前所述,不能阻止任何人向选择器发送消息,但通过使用类别,可以降低这些函数的可见性。
此外,可以有多个类别扩展一个类。因此,通过使用信息类名称,可以将私有函数分组到相关的块中,从而改进代码的自记录性质。