是否可以在 Objective-C 中将方法声明为私有?
Posted
技术标签:
【中文标题】是否可以在 Objective-C 中将方法声明为私有?【英文标题】:Is it possible to declare a method as private in Objective-C? 【发布时间】:2010-10-13 10:08:31 【问题描述】:【问题讨论】:
其他答案可以在***.com/questions/172598/…找到 可能重复。 "***.com/questions/172598/…" 【参考方案1】:如果您使用的是 Objective-C 2.0,创建对其他人来说“难以”调用的方法的最佳方法是将它们放在 class extension 中。假设你有
@interface MyClass : NSObject
- (id)aPublicMethod;
@end
在MyClass.h
文件中,您可以将以下内容添加到您的MyClass.m
:
@interface MyClass () //note the empty category name
- (id)aPrivateMethod;
@end
@implementation MyClass
- (id)aPublicMethod ...
- (id)aPrivateMethod ... //extension method implemented in class implementation block
@end
类扩展的优点是“扩展”方法是在原始类主体中实现的。因此,您不必担心方法实现在哪个@implementation
块中,如果类'@implementation
中未实现扩展方法,编译器会发出警告。
正如其他人所指出的,Objective-C 运行时不会强制您的方法的私有性(即使没有源代码,也不难找出这些方法正在使用类转储),但编译器会如果有人试图打电话给他们,就会产生警告。一般来说,ObjC 社区接受“我告诉过你不要调用这个方法[通过将它放在私有类扩展或类别中,或者只是通过记录该方法是私有的],无论如何你都调用了它. 发生什么乱七八糟的都是你的错。别傻了。对这个问题的态度。
【讨论】:
【参考方案2】:不,任何对象都可以向任何其他对象发送任何消息。但是,您可以将该方法放在属于该类的实现文件的类别中。这样,如果您尝试在其他任何地方调用它,您将收到“类可能无法实现此方法”的警告。这是将方法设为“私有”的正常方式。
【讨论】:
【参考方案3】:没有什么可以阻止该方法被调用(因为objective-c是基于消息的,任何东西都可以发送任何消息),但是您可以在标头之外声明它们,因此它们不可见,并且编译器将在以下情况下生成警告用过。
这适用于类和实例方法。
例如
#import "SomeClass.h"
// Interface for hidden methods
@interface SomeClass (hidden)
+(void) hiddenClassMethod;
-(void) hiddenInstanceMethod;
@end
注意:不要像这样声明变量,否则它们将成为类变量 - 例如所有实例只会使用一个变量。
【讨论】:
可以在基于消息的语言中使用私有方法。鲁比做到了。 Objective-C 只是碰巧没有。 对,我从来没有说过这对所有基于消息的语言都是通用的。 Ruby 只会掩盖它们,就像 Objective-C 一样:blog.jayfields.com/2007/11/ruby-testing-private-methods.html 实际上,目标是封装,而不是安全性。如果您不能信任系统中运行的所有代码,无论如何都会丢失。 注意:最近对目标 C 的补充是,您可以将类别留空,如果找不到方法,则会出现错误 - 所以它看起来像:@interface SomeClass () 在执行。不过命名没有错。【参考方案4】:您可以通过使用类别来做到这一点。我对this SO 问题的回答中有更完整的描述。
如前所述,您无法阻止任何人向选择器发送消息,但通过使用类别可以降低这些功能的可见性。
此外,您可以拥有多个类别来扩展一个类。因此,通过使用信息丰富的类别名称,您可以将私有函数分组到相关的块中,从而提高代码的自记录性。
【讨论】:
【参考方案5】:正如其他人提到的,你不能拥有这样的代码
-
一种方法,以及
无法从课堂外调用。
人们已经指出,您可以放弃第 2 点,并获得一个难以调用但并非不可能调用的方法。或者,为什么不放弃第 1 点呢?
static id myPrivateMethod(MyObject *me, int arg1, id arg2) ...
现在只能从同一个文件中调用代码。您无法通过方法获得任何神奇的私有成员访问权限,因此这绝不是一个完美的解决方案。但是没有更好的方法来实现隐私。
【讨论】:
【参考方案6】:实现隐藏方法(实例和/或类)
// ===========================
// = 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\n" );
-(void) msg
printf("Inside msg()...\n");
[self hiddenInstanceMethod];//private method calling
@end
http://macdevelopertips.com/objective-c/private-methods.html
参考这个链接会有帮助的。
【讨论】:
以上是关于是否可以在 Objective-C 中将方法声明为私有?的主要内容,如果未能解决你的问题,请参考以下文章
如何将有效负载值存储在全局变量中 - Objective-c
如何在 Objective-c 中将 NSDictionary 表示为文字?
是否可以将实际参数定义为`const int`,但在头文件中将其声明为`int`?