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

Posted

技术标签:

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

【问题讨论】:

其他答案可以在***.com/questions/172598/…找到 可能重复。 "***.com/questions/172598/…" 【参考方案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】:

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

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

人们已经指出,您可以放弃第 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

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

【讨论】:

以上是关于是否可以在 Objective-C 中将方法声明为私有?的主要内容,如果未能解决你的问题,请参考以下文章

如何将有效负载值存储在全局变量中 - Objective-c

如何在 Objective-c 中将 NSDictionary 表示为文字?

是否可以将实际参数定义为`const int`,但在头文件中将其声明为`int`?

在Swift或Objective-C中将大型混合数字和文本数字转换为数字

如何在 Objective-C 中将 int 转换为字节?

在Unity中将Unity生成的代码与Objective-C混合使用?