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

时间:2009-03-15 01:33:38

标签: objective-c

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

6 个答案:

答案 0 :(得分:34)

如果您正在使用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社区采用“我告诉过你不要调用这种方法[将它放在私有类扩展或类别中,或者只是通过记录方法是私有的]来调用它,然后你就调用了它无论发生什么混乱都是你的错。不要愚蠢。“对这个问题的态度。

答案 1 :(得分:2)

不,任何对象都可以向任何其他对象发送任何消息。但是,您可以将该方法放在类的实现文件中。这样,如果您尝试在其他地方调用它,您将获得“类可能不会实现此方法”警告。这是使方法“私密”的正常方法。

答案 2 :(得分:2)

没有什么可以阻止调用该方法(因为objective-c是基于消息的任何东西都可以发送任何消息),但你可以在标题之外声明它们,这样它们就不可见了,编译器会产生警告使用

这适用于类和实例方法。

E.g。

#import "SomeClass.h"

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

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

答案 3 :(得分:0)

您可以使用类别来完成此操作。我在回答this问题的答案中得到了更全面的描述。

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

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

答案 4 :(得分:0)

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

的代码
  1. 一种方法,
  2. 无法从课外打电话。
  3. 人们已经指出你可以放弃第2点,并获得一个很难但不可能调用的方法。或者,为什么不放弃第1点?

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

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

答案 5 :(得分:0)

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

    // ===========================
    // = 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

提供此链接会有所帮助。