【问题标题】:Is it possible to declare a method as private in Objective-C?是否可以在 Objective-C 中将方法声明为私有?
【发布时间】:2010-10-13 10:08:31
【问题描述】:

是否可以在 Objective-C 中将方法声明为私有?

【问题讨论】:

标签: objective-c


【解决方案1】:

如果您使用的是 Objective-C 2.0,创建对其他人来说“难以”调用的方法的最佳方法是将它们放在 class extension 中。假设你有

@interface MyClass : NSObject {

}

- (id)aPublicMethod;

@end

MyClass.h 文件中,您可以将以下内容添加到您的MyClass.m

@interface MyClass () //note the empty category name
- (id)aPrivateMethod;
@end

@implementation MyClass
- (id)aPublicMethod {...}
- (id)aPrivateMethod {...} //extension method implemented in class implementation block
@end

类扩展的优点是“扩展”方法是在原始类主体中实现的。因此,您不必担心方法实现在哪个@implementation 块中,如果类'@implementation 中未实现扩展方法,编译器会发出警告。

正如其他人所指出的,Objective-C 运行时不会强制您的方法的私有性(即使没有源代码,也不难找出这些方法正在使用类转储),但编译器会如果有人试图打电话给他们,就会产生警告。一般来说,ObjC 社区接受“我告诉过你不要调用这个方法[通过将它放在私有类扩展或类别中,或者只是通过记录该方法是私有的],无论如何你都调用了它. 发生什么乱七八糟的都是你的错。别傻了。对这个问题的态度。

【讨论】:

    【解决方案2】:

    不,任何对象都可以向任何其他对象发送任何消息。但是,您可以将该方法放在属于该类的实现文件的类别中。这样,如果您尝试在其他任何地方调用它,您将收到“类可能无法实现此方法”的警告。这是将方法设为“私有”的正常方式。

    【讨论】:

      【解决方案3】:

      没有什么可以阻止该方法被调用(因为objective-c是基于消息的,任何东西都可以发送任何消息),但是您可以在标头之外声明它们,因此它们不可见,并且编译器将在以下情况下生成警告用过。

      这适用于类和实例方法。

      例如

      #import "SomeClass.h"
      
      // Interface for hidden methods
      @interface SomeClass (hidden)
      +(void) hiddenClassMethod;
      -(void) hiddenInstanceMethod; 
      @end
      

      注意:不要像这样声明变量,否则它们将成为类变量 - 例如所有实例只会使用一个变量。

      【讨论】:

      • 可以在基于消息的语言中使用私有方法。鲁比做到了。 Objective-C 只是碰巧没有。
      • 对,我从来没有说过这对所有基于消息的语言都是通用的。
      • Ruby 只会掩盖它们,就像 Objective-C 一样:blog.jayfields.com/2007/11/ruby-testing-private-methods.html 实际上,目标是封装,而不是安全性。如果您不能信任系统中运行的所有代码,无论如何都会丢失。
      • 注意:最近对目标 C 的补充是,您可以将类别留空,如果找不到方法,则会出现错误 - 所以它看起来像:@interface SomeClass () 在执行。不过命名没有错。
      【解决方案4】:

      您可以通过使用类别来做到这一点。我对this SO 问题的回答中有更完整的描述。

      如前所述,您无法阻止任何人向选择器发送消息,但通过使用类别可以降低这些功能的可见性。

      此外,您可以拥有多个类别来扩展一个类。因此,通过使用信息丰富的类别名称,您可以将私有函数分组到相关的块中,从而提高代码的自记录性。

      【讨论】:

        【解决方案5】:

        正如其他人提到的,你不能拥有这样的代码

        1. 一种方法,以及
        2. 无法从课堂外调用。

        人们已经指出,您可以放弃第 2 点,并获得一个难以调用但并非不可能调用的方法。或者,为什么不放弃第 1 点呢?

        static id myPrivateMethod(MyObject *me, int arg1, id arg2) { ... }

        现在只能从同一个文件中调用代码。您无法通过方法获得任何神奇的私有成员访问权限,因此这绝不是一个完美的解决方案。但是没有更好的方法来实现隐私。

        【讨论】:

          【解决方案6】:

          实现隐藏方法(实例和/或类)

              // ===========================
              // = File: SomeClass.m
              // ===========================
              #import "SomeClass.h"
          
              // =================================
              // = Interface for hidden methods
              // =================================
              @interface SomeClass (hidden)
          
              -(void) hiddenInstanceMethod; 
          
              @end
          
          
              // ================================
              // = Implementation for SomeClass
              // ================================
              @implementation SomeClass
               -(void) hiddenInstanceMethod
              {
                printf( "Hidden instance method\n" );
              }         
          
              -(void) msg
              {
                printf("Inside msg()...\n");
          
                [self hiddenInstanceMethod];//private method calling
          
              }
          
          
          
          @end
          

          http://macdevelopertips.com/objective-c/private-methods.html

          参考这个链接会有帮助的。

          【讨论】:

            猜你喜欢
            • 2010-09-16
            • 1970-01-01
            • 2012-02-24
            • 2011-10-09
            • 2023-03-08
            • 1970-01-01
            • 1970-01-01
            • 2011-04-09
            相关资源
            最近更新 更多