私有方法作为公共方法出现
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 文件中的所有内容一样? 我真的不知道。我总是使用你这样做的方式,但以下划线_
开头命名我的方法。这样我就可以很容易地确定一个方法是否是私有的。以上是关于私有方法作为公共方法出现的主要内容,如果未能解决你的问题,请参考以下文章