是否可以在Objective-C中将方法声明为私有?
答案 0 :(得分:34)
如果您正在使用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社区采用“我告诉过你不要调用这种方法[将它放在私有类扩展或类别中,或者只是通过记录方法是私有的]来调用它,然后你就调用了它无论发生什么混乱都是你的错。不要愚蠢。“对这个问题的态度。
答案 1 :(得分:2)
不,任何对象都可以向任何其他对象发送任何消息。但是,您可以将该方法放在类的实现文件中。这样,如果您尝试在其他地方调用它,您将获得“类可能不会实现此方法”警告。这是使方法“私密”的正常方法。
答案 2 :(得分:2)
没有什么可以阻止调用该方法(因为objective-c是基于消息的任何东西都可以发送任何消息),但你可以在标题之外声明它们,这样它们就不可见了,编译器会产生警告使用
这适用于类和实例方法。
E.g。
#import "SomeClass.h"
// Interface for hidden methods
@interface SomeClass (hidden)
+(void) hiddenClassMethod;
-(void) hiddenInstanceMethod;
@end
注意:不要声明这样的变量,否则它们将成为类变量 - 例如所有实例都只使用一个变量。
答案 3 :(得分:0)
您可以使用类别来完成此操作。我在回答this问题的答案中得到了更全面的描述。
如前所述,您无法阻止任何人向选择器发送消息,但通过使用类别,您可以降低这些功能的可见性。
此外,您可以使用多个类来扩展类。因此,通过使用信息类别名称,您可以将私有函数分组到相关块中,从而改善代码的自我记录性质。
答案 4 :(得分:0)
正如其他人提到的,你不能拥有
的代码人们已经指出你可以放弃第2点,并获得一个很难但不可能调用的方法。或者,为什么不放弃第1点?
static id myPrivateMethod(MyObject *me, int arg1, id arg2) { ... }
现在只能从同一个文件中调用代码。您没有获得任何可以使用方法获得的魔法私有成员访问权限,因此这绝不是一个完美的解决方案。但是没有更好的方法来实现隐私。
答案 5 :(得分:0)
实现隐藏方法(实例和/或类)
// ===========================
// = 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
提供此链接会有所帮助。