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

Is it possible to declare a method as private in Objective-C?

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


如果您使用的是Objective-c 2.0,那么创建其他人难以调用的方法的最佳方法是将它们放入类扩展中。假设你有

1
2
3
4
5
6
7
@interface MyClass : NSObject {

}

- (id)aPublicMethod;

@end

MyClass.h文件中,可以向MyClass.m添加以下内容:

1
2
3
4
5
6
7
8
@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社区接受一个"我告诉过你不要调用这个方法[把它放在一个私有类扩展或类别中,或者仅仅通过记录这个方法是私有的],你无论如何都会调用它。无论发生什么混乱,都是你的错。别傻了。"对待这个问题的态度。


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

这对类和实例方法都有效。

例如。

1
2
3
4
5
6
7
#import"SomeClass.h"

// Interface for hidden methods
@interface SomeClass (hidden)
+(void) hiddenClassMethod;
-(void) hiddenInstanceMethod;
@end

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


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    // ===========================
    // = 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
"
);
    }        

    -(void) msg
    {
      printf("Inside msg()...
"
);

      [self hiddenInstanceMethod];//private method calling

    }



@end

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

重新访问此链接将有所帮助。


正如其他人提到的,您不能拥有

  • 一种方法,以及
  • 不能从班外打电话。
  • 人们已经指出,您可以放弃第2点,得到一个很难但不可能调用的方法。或者,为什么不放弃第1点?

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

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


    你可以通过分类来做到这一点。我对这个问题的答案有更详尽的描述。

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

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