【问题标题】:When & why do you use @interface ClassName (Private)? - Objective-C何时以及为什么使用@interface ClassName (Private)? - 目标-C
【发布时间】:2012-02-01 20:31:12
【问题描述】:

我在看一些代码:

@interface ClassName (Private)

- (float)methodOne:(NSDictionary *)argOne;
- (void)methodTwo:(NSDictionary *)argTwo;

@end

@implementation ClassName
....

上面的代码在 ClassName.m 文件的顶部,似乎为类定义了额外的接口方法为私有的?

为什么要这样做?有什么意义?还有什么可以去哪里(私人)?有人有这方面的文档吗?

谢谢

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    这是一种防止类内部使用的方法暴露给其他人的方法。它是封装的一部分。在 Objective-C 2.0(iOS 和 Mac OS X 10.5+)中,在实现文件的顶部使用类扩展更为常见:

    @interface ClassName ()
    
    - (void)privateMethod;
    
    @end
    

    类扩展实际上只是一个类别的特例(这是您所询问的)。主要区别在于,对于一​​个类别,即使您的 @implementation 不包含该类别中声明的方法的定义,编译器也不会抱怨。对于类扩展中的方法,您的类必须在其主 @implementation 块中实现这些方法,否则您将收到编译器警告。

    最好在 iOS 代码或至少针对 Mac OS X 10.5 Leopard 的 Mac 代码中使用类扩展。

    【讨论】:

    • 基本上,“@interface ClassName (Private)”是“@interface ClassName ()”的折旧形式。正确吗?
    • @WebOrCode,你可以说,虽然它没有被官方弃用,但毕竟只是一个约定和使用更广泛适用的 ObjC 功能(类别)。使用(Private) 意味着您声明了一个 named 类别,该类别并未被弃用。它只是将它们用作声明已被类扩展取代的“私有”属性的一种方式。
    【解决方案2】:

    基本上它是一个类别,允许在 .m 文件中添加方法。现在最好的方法是使用类扩展,语法类似,只是缺少“Private”,只是两个括号。

    类扩展的另一个优点是还可以包含属性,编译器将验证所有声明的方法是否都已定义。

    一个非常方便的领域是能够在 .h 文件中正确声明只读并在 .m 文件中进行读写。这样类的用户只有读取权限,但类本身具有完全访问权限。

    【讨论】:

      【解决方案3】:

      objective-c 不支持私有方法,你问的方式是替代它。

      您可以查看此链接了解详细信息: Why doesn't Objective-C support private methods?

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 2011-12-31
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 2013-06-13
        • 2021-01-24
        • 2013-01-05
        相关资源
        最近更新 更多