【问题标题】: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

【问题讨论】:

    标签: objective-c public-method


    【解决方案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 文件中的所有内容一样?
      • 我真的不知道。我总是使用你这样做的方式,但以下划线 _ 开头命名我的方法。这样我就可以很容易地确定一个方法是否是私有的。
      猜你喜欢
      • 1970-01-01
      • 2011-12-06
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多