【问题标题】:Is it good practice to put private API in the .m files and public API in .h files in Cocoa?将私有 API 放在 .m 文件中,将公共 API 放在 Cocoa 中的 .h 文件中是一种好习惯吗?
【发布时间】:2010-03-29 17:14:39
【问题描述】:

我当前项目中的许多类都有几个属性和方法,这些属性和方法只能从类本身中调用。此外,根据班级的当前状态,它们可能会干扰班级的工作。
目前,所有这些接口都在 .h 文件的主接口声明中定义。将“私有”方法和属性放在 .m 文件的顶部是否被认为是一种好习惯?

这不会影响任何事情,因为我很可能是唯一一个查看此源代码的人,但当然对于未来的项目了解它会很有趣。

【问题讨论】:

    标签: cocoa interface implementation private


    【解决方案1】:

    从 Objective-C 2.0 开始,最佳实践是将私有方法放在“类扩展”中。如果您尚未实现其中一种方法,这允许编译器向您发出警告。类扩展还允许您修改 @properties 的读/写语义,例如,公共 API 可以为属性指定 readonly,而在内部,该属性可以用作 readwrite

    在.h中:

    @interface MyClass : NSObject
    {}
    
    @property (readonly) id myProp;
    
    - (void)aPublicMethod;
    @end
    

    在.m:

    @interface MyClass ()
    @property (readwrite) id myProp; //upgrade myProp to readwrite within the class.
    
    - (id)aPrivateMethod;
    @end
    
    @implementation MyClass
    @synthesize myProp;
    
    - (void)aPublicMethod { ... }
    
    - (id)aPrivateMethod;
    
    @end
    

    如果您忘记在 @implementation 主块中实现 -aPrivateMethod,编译器将给出警告。这比使用 @interface MyClass (PrivateMethods) 之类的旧方法要好,在这种情况下,编译器无法警告您该方法未实现。

    【讨论】:

    • 类扩展是要走的路。 IIRC 扩展方法 必须 在主 @implementation 块中定义。如果您使用命名类别,那么它可以放在主 @implementation 块中,也可以放在相同或不同 .m 文件中的单独块中。
    • @Abizem 完全正确。这就是为什么如果您忘记在命名类别中实现方法,编译器不会/不能警告您的原因;实现可以在任何地方,甚至可以在运行时添加。
    【解决方案2】:

    是的,将它们放在 .m 文件顶部的类别中。

    【讨论】:

    • 如果您使用的是 Objective-C 2.0,请在 .m 文件中使用类扩展而不是类别。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2019-06-04
    • 1970-01-01
    • 2013-10-14
    • 2016-12-03
    • 2017-07-15
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多