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

Posted

技术标签:

【中文标题】私有方法作为公共方法出现【英文标题】:Private methods are appearing as public methods 【发布时间】:2011-04-18 05:31:15 【问题描述】:

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

【问题讨论】:

【参考方案1】:

正如 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 了解更多信息。

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

感谢 JoostK - 我在网上找到了相互矛盾的信息 - 不要认为人们理解它。 只是出于兴趣 - Apple 推荐什么?就像我已经完成或 .h 文件中的所有内容一样? 我真的不知道。我总是使用你这样做的方式,但以下划线 _ 开头命名我的方法。这样我就可以很容易地确定一个方法是否是私有的。

以上是关于私有方法作为公共方法出现的主要内容,如果未能解决你的问题,请参考以下文章

私有类作为公共方法的返回类型

不能使用公共嵌套类作为私有方法参数

JavaScript,在公共方法中将私有函数作为字符串调用,而不使用 eval(显示模式)

方法调用公共/私有成员或方法最佳实践 - C#.NET

在 JavaScript 中的公共方法中获取私有方法值

我可以在公共方法中声明私有变量吗?