关于语法:有关Objective-C私有方法示例的问题

Questions regarding Objective-C private method example

以下是如何在Objective-C中创建"private"方法的示例:

MyClass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#import"MyClass.h"
#import <stdio.h>

@implementation MyClass
-(void) publicMethod {
    printf("public method
"
);
}
@end

// private methods
@interface MyClass (Private)
-(void) privateMethod;
@end

@implementation MyClass (Private)
-(void) privateMethod {
    printf("private method
"
);
}
@end

为什么这个例子在@interface MyClass (Private)@implementation MyClass (Private)声明中使用(Private)类别名称?.m文件中声明的接口不是自动私有的吗?我们需要两个不同的实现块吗?

创建"受保护"方法的方法是否有变化?

(我对Objective-C不熟悉。我是否遗漏了类别名称的要点?为什么我们需要在这个实例中使用它们?)

谢谢-


如果你要创建一个类别,你必须给它取个名字。该类别的名称Private对该语言没有任何特殊意义。

另外,在现代的Objective-C中,对于类扩展来说,这是一个更好的例子,类扩展被声明为一个无名称的类别(@interface MyClass (),但实现是在主@implementation块中进行的。不过,这是最近才增加的。在您的示例中,秘密类别方法是完成大致相同事情的更传统的方法。


(Private)部分为MyClass声明一个类别。类别名称可以是任何东西,但编译器解释的所有类别都会将该类别中的方法作为一个整体添加到该类的已知方法列表中。通过将私有方法放在源文件顶部的类别中,您可以在主.h文件中声明到类的公共接口,但所有私有方法都将隐藏在.m文件中,而您仍然可以在没有编译器警告方法的情况下使用这些方法没有找到。

类别名称仅用于"对类的方法进行分类"。你可以根据自己的喜好对它们进行分类。名称并不重要,简单地调用类别Private不会使这些方法成为私有的,它们仍然能够被子类覆盖,并且能够通过内省发现。

基本上,您只是将公共接口从类和私有接口中分离出来。如果您必须使用库的头来发送它,那么头将不包含任何私有方法。

不过,通常情况下,私有接口放在源文件的顶部,以便编译器在解释主实现和私有实现之前解释它(并查找类别提供的所有方法)。