私有方法被呈现为公共方法

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
2个回答

5
正如JoostK所说,Objective-C中没有像C++、Java或C#中的私有方法。
此外,表达式@interface NSContentWebServiceController(private)在Objective-C中定义了所谓的类别。这里的“private”仅是类别的名称,没有实际意义。在这里加入类别名为“yellowBunny”的效果是相同的。类别只是将一个类分解成几个部分的一种方式,但在运行时所有类别都有效。请注意,类别只能向对象类添加新方法,而不能添加新变量。
对于私有类别,现在更倾向于使用匿名类别,例如@interface MyClass(),因为您不需要单独的@implementation MyClass(yellowBunny)块,而可以将方法添加到主要的@implementation块中。
有关更多信息,请参见Objective-C维基百科条目中的"类别"部分

3

私有方法只是在头文件中没有记录的方式下才是私有的。因此,您无法将它们#import到您的项目中,编译器会警告您出现“选择器未被识别”或类似的情况。

您可以像公共方法一样调用这些方法,因为只有在声明原型时才能使方法成为私有方法,Objective-C确实没有真正私有的隐藏方法。

在运行时,您始终可以使用内省找到所有方法,因此真正没有完全隐藏您的方法/属性的方法。

您可以添加一个指向执行所有工作的对象的id _internal实例变量,这样调用私有方法就会更加困难,但并非不可能。


谢谢JoostK - 我在网上找到了矛盾的信息 - 不认为人们理解它。 - TheLearner
仅出于兴趣 - 苹果公司推荐什么?就像我做的那样还是所有内容都在.h文件中? - TheLearner
我其实也不知道。我总是像你这样做,但我的方法名称都以下划线 _ 开头。这样我就能轻松地识别一个方法是否为私有的。 - Joost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接