4

我正在尝试通过使用私有方法来改进我的应用程序的设计。来自 .NET 我有点困惑,因为我在 .m 文件中声明了这些方法,但从其他文件中它们仍然显示出来,即它们仍然可以访问。

.m 文件:

@interface NSContentWebServiceController (private)

- (NSString *)flattenHTML:(NSString *)html;
- (NSString *)cleanseStringOfJsonP:(NSString *)jsonP;
- (void)retrieve:(NSasdf *)hasdel :(NSDictionary *)rootList;   
- (NSString *)removeHTMLTagsFromString:(NSString *)aString;

@end
4

2 回答 2

5

正如 JoostK 所说,Objective-C 中没有私有方法,就像 C++、Java 或 C# 中的私有方法一样。

最重要的是,表达式@interface NSContentWebServiceController (private)在 Objective-C 中定义了一个所谓的类别。这里的术语private只是类别的名称,没有任何意义。在这里有类似的东西yellowBunny会产生同样的效果。类别只是将一个类分解为多个部分的一种方式,但在运行时所有类别都有效。请注意,类别只能将新方法添加到对象类,但不能添加新变量。

对于私有类别,现在首选使用匿名类别,如@interface MyClass(),因为您不需要单独的@implementation MyClass(yellowBunny)块,而只需将方法添加到主@implementation块。

有关更多信息,请参阅Wikipedia 条目中有关 Objective-C 的“类别”部分

于 2010-09-28T10:57:27.130 回答
3

私有方法只是私有的,它们没有记录在头文件中。因此,您不能将#import它们放入您的项目中,因此编译器会警告您“选择器无法识别”或类似的情况。

您将能够像调用公共方法一样调用这些方法,因为它只是您声明使方法私有的原型的地方,Objective-C 没有隐藏的、真正私有的方法之类的东西。

在运行时,您将始终能够使用自省找到所有方法,因此实际上没有办法完全隐藏您的方法/属性。

您可以添加一个id _internal实例变量,它指向一个完成所有工作的对象,这样调用私有方法就有点困难了,尽管并非不可能。

于 2010-09-28T10:38:55.937 回答