似乎有大约知名度和什么+
和-
意味着一些混乱。
在+
和-
的情况下,恰当地指定类别与实例方法。或者,在其他语言的术语,+ (void) foo
相同static void foo()
和- (void) bar
相同void bar()
(例如,-
是一个实例方法)。
关于知名度的问题;严格地说Objective-C不像其他语言那样具有公共,私人等概念。任何消息都可以发送给任何对象,即使它没有实现该方法。
但是,这并不意味着你不能隐藏一类的公共报头的方法的声明。所以,通常你会有一个头文件,如:
@interface MyObject
- (void) foo;
- (void) secretFoo;
@end
你会有执行(。M)为:
@implementation MyObject
- (void) foo {
NSLog(@"OMG FOO!");
}
- (void) secretFoo{
NSLog(@"WAT! Don't do that");
}
@end
现在,让我们说该方法- (void) secretFoo
是,因为它的名字所暗示的,秘密的。而且,你更喜欢不只是任何人称它。那么,正如事情被定义的那样,你的公众头部向全世界传播了这种秘密方法的存在。解决这个问题的方法是从公共标题中删除:
@interface MyObject
- (void) foo;
@end
现在,没有人(一般来说)会知道你的秘密方法。但是,有一个小问题...如果你尝试调用你的secretMethod(通过正常的方式),你会得到一个编译器警告或者甚至错误(取决于你是否使用ARC)。没有人想要不必要的警告,如果你使用ARC,它是一个完整的禁止...
警告或错误的原因是一样的,你会试图调用secretFoo
,但没有这样的方法是定义。因此,您现在需要弄清楚如何在公共标题中定义该方法,但而不是。我这样做的方法就是修改相应的实现文件:
@interface MyObject(Private)
- (void) secretFoo{
@end
@implementation MyObject
- (void) foo {
NSLog(@"OMG FOO!");
}
- (void) secretFoo{
NSLog(@"WAT! Don't do that");
}
@end
现在,你有你自己的使用(例如,没有警告或错误)来定义你的secretFoo
方法,但它不是向全世界广播。
尽管我使用术语(Private)
,但我仅仅实现了Category,它只在实现文件中定义,因此通常不可见。
我认为你需要在Objective-C中重新学习方法可见性:所有方法都是公共的。有许多方法可以混淆方法的存在,但如果实现方法,类将响应发送给它的消息。 '+'表示它是一个静态(或类)方法。 '-'意味着它是一个实例方法。两者都是公开的。 – 2012-02-23 20:55:52
'+'符号表示类方法,与可见性无关。有菜单问题(和答案!)在这里处理类方法:http://stackoverflow.com/search?q=%5Bobjective-c%5D+class+method&submit=search – Monolo 2012-02-23 20:56:15