以下是如何在Objective-C中创建“私有”方法的示例:
MyClass.m
#import "MyClass.h"
#import <stdio.h>
@implementation MyClass
-(void) publicMethod {
printf( "public method\n" );
}
@end
// private methods
@interface MyClass (Private)
-(void) privateMethod;
@end
@implementation MyClass (Private)
-(void) privateMethod {
printf( "private method\n" );
}
@end
为什么此示例在(Private)
和@interface MyClass (Private)
声明中使用@implementation MyClass (Private)
类别名称? .m文件中声明的接口不是自动私有的吗?我们需要2个不同的实现块吗?
这种技术是否有变化来创建“受保护”方法?
(我是Objective-C的新手。我是否忽略了类别名称的要点?为什么我们需要在这个实例中使用它们?)
谢谢 -
答案 0 :(得分:2)
(Private)
部分声明了MyClass
的类别。类别名称可以是任何类型,但编译器解释的所有类别都会将该类别中的方法添加到该类作为整体的已知方法列表中。通过将私有方法放在源文件顶部的类别中,您可以在主.h
文件中声明类的公共接口,但所有私有方法都将“隐藏”在{{1}内在你没有编译器警告没有找到方法的情况下,你仍然能够使用这些方法。
类别名称仅用于“分类”类的方法。您可以按照自己的方式对它们进行分类。名称并不重要,简单地调用类别.m
不会使这些方法变为私有,它们仍然可以被子类覆盖并且能够被内省发现。
基本上,您只是将您的类的公共接口与您的私有接口分开。如果您必须发送带有标头的库,则标头将不包含任何私有方法。
通常,私有接口位于源文件的顶部,以便编译器在解释主要和私有实现之前解释它(并找到该类别提供的所有方法)。
答案 1 :(得分:2)
如果您要创建类别,则必须为其指定部分名称。该类别的名称Private
对该语言没有任何特殊含义。
此外,在现代Objective-C中,这对于class extension来说是更好的情况,{{3}}被声明为无名类别(@interface MyClass ()
),但实现在主@implementation
中阻止。不过,这是一个相对较新的补充。你的例子中的秘密类别方法是更传统的方法来完成大致相同的事情。