私有方法作为公共方法出现

时间:2010-09-28 10:31:51

标签: objective-c public-method

我正在尝试使用私有方法改进我的应用程序的设计。来自.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

2 个答案:

答案 0 :(得分:5)

正如JoostK所说,Objective-C中没有私有方法,就像你在C ++,Java或C#中使用它们一样。

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

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

有关详细信息,请参阅"Categories" section in the Wikipedia entry on Objective-C

答案 1 :(得分:3)

私有方法只是以未在头文件中记录的方式私有。因此,你不能#import他们进入你的项目,因此编译器会警告你'未被识别的选择器'或类似的东西。

你将能够像公共方法一样调用这些方法,因为它只是 where 你声明了一个使方法变为私有的原型,Objective-C没有隐藏这样的东西,非常私人的方法。

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

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