【问题标题】:how to make a single method in a class to private in Objective-c?如何在Objective-c中将类中的单个方法设为私有?
【发布时间】:2011-01-23 04:01:44
【问题描述】:

如何在 Objective-c 中将类中的单个方法设为私有?

【问题讨论】:

标签: objective-c private


【解决方案1】:

Objective-C 中没有私有方法的概念。但是,您可以做的是在头文件中忽略该方法并在私有文件中添加一个类别。

通常是这样的:

@interface MyObject : NSObject {
   // ivars
}
// public methods
@end

// usually in a seperate file
@interface MyObject ()
// private methods
@end

类别的空名称意味着它是class extension,这告诉编译器在主实现块中需要该方法。

【讨论】:

    【解决方案2】:

    严格来说,你不能在 Objective-C 中创建私有方法;但您可以在包含实现 (MyClass.m) 的文件中创建一个类别,将其隐藏在头文件 (MyClass.h) 中。

    //MyClass.h    
    #import <Foundation/Foundation.h>
    
    @interface MyClass : NSObject {
    
    }
    
    @end
    

    实现文件:

    //MyClass.m
    
    @interface MyClass ()
    
    - (void)myPrivateMethod;
    
    @end
    
    @implementation MyClass
    
    - (void)myPrivateMethod {
      return;
    }
    
    @end
    

    【讨论】:

      【解决方案3】:

      Objective-C 在设计上不支持原生方法。

      但是,您可以通过使用“类扩展”(匿名类别)来实现私有方法控制。

      基本思想是在你的类的实现文件(不是它的头文件)内,但在你的@implementation 块之外,用你的私有方法声明一个类扩展。然后您可以实现这些方法,并且没有外部类能够看到它们。像这样:

      @interface MyClass ()
          - (void)myPrivateMethod;
      @end
      
      @implementation MyClass
          - (void)myPrivateMethod
          {
              //implementation goes here
          }
      
          -(void)someOtherMethod
          {
              [self myPrivateMethod];
          }
      @end
      

      使用类扩展会强制您实现主 @implementation 块中的方法,并要求实现它们(就像它们在标题中的主 @interface 块中声明一样)。

      不幸的是,由于 Objective-C 的动态特性,这实际上不会阻止这些方法被其他类调用。他们将收到一个警告,告诉他们该类可能不会响应该消息,但在运行时它会起作用。这给您的唯一好处是能够对其他程序员隐藏这些方法。

      【讨论】:

      • 匿名类别称为类扩展。不同之处在于方法必须在主实现块中声明。普通类别可能在单独的、在主实现块中,甚至根本没有。
      【解决方案4】:

      你不能。只有实例变量可以标记为私有。

      虽然有一些方法可以做一些与私有方法等效的事情。 一般的想法是,您不在标头中而是在实现文件中声明私有方法。

      因此,如果您想要一个公共 (myPublicMethod) 和私有 (myPrivateMethod) 方法,您的标头可能如下所示:

      @interface MyClass {
      }
      - (void)myPublicMethod;
      @end
      

      然后你的实现文件有三个选项:

      1.

      不要在任何@interface 部分中声明该方法,只需确保它在@implementation 部分中使用之前已实现。

      @implementation MyClass
      
      - (void)myPrivateMethod {  }
      
      - (void)myPublicMethod {
          [self myPrivateMethod];
      }
      
      @end
      

      2.

      在您的实现文件中使用匿名类别来声明私有方法并在主@implementation 块中实现它们。

      @interface MyClass ()
      - (void)myPrivateMethod;
      @end
      
      @implementation MyClass
      
      - (void)myPrivateMethod {  }
      
      - (void)myPublicMethod {
          [self myPrivateMethod];
      }
      
      @end
      

      3.

      在您的实现文件中使用常规类别并在单独的@implementation 块中实现私有方法。

      @interface MyClass (PrivateMethods)
      - (void)myPrivateMethod;
      @end
      
      @implementation MyClass (PrivateMethods)
      
      - (void)myPrivateMethod {  }
      
      @end
      
      @implementation MyClass
      
      - (void)myPublicMethod {
          [self myPrivateMethod];
      }
      
      @end
      

      【讨论】:

      • 每种方法的优点/缺点会很好。
      猜你喜欢
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2012-10-15
      • 2012-05-06
      • 2022-06-11
      • 2010-10-01
      相关资源
      最近更新 更多