【问题标题】:Difference between declaring methods in .h file and in .m file specifying @interface and @end在 .h 文件中声明方法和在 .m 文件中指定 @interface 和 @end 之间的区别
【发布时间】:2011-11-19 18:18:12
【问题描述】:

我只是不明白为什么有些人在 .m 文件中声明方法。这些声明不能直接放在 .h 文件中吗?以下是我看到的主要内容:

//myClass.h

#import <UIKit/UIKit.h>

@interface myClass: UIViewController
{

}

@end

以及实现(.m)部分:

//myClass.m

#import "myClass.h"

@interface myClass

//declare some methods here

@end

@implementation myClass

//the actual implementation

@end

以这种方式声明方法有什么区别吗?另外,“@private”方法可以在 myClass.h 本身中声明,不是吗?

【问题讨论】:

标签: iphone objective-c


【解决方案1】:

这是关于保持类的公共接口和私有接口之间的分离。

能够在实现文件中声明方法、属性和 iVar 可以清楚地表明您可以在类内做什么和使用什么,以及从类外可以做什么。

您还可以重新声明属性。例如:

在.h中

@property (readonly, copy) NSString *aString;

.m

@property (readwrite, copy) NSString *aString;

因此,在您的类中,您可以将该属性视为读写,但在外部,该属性是只读的。

【讨论】:

    【解决方案2】:

    您发布的代码都无法编译,也不等同于在标头中声明方法。

    标头的目的是提供一组其他类可以导入的声明。他们无法导入您的实现文件,因为这会创建重复的定义。

    正如 bbum 所说,您可能看到的是实现文件中的私有方法声明。这些不打算在类之外使用,因此它们在实现文件中声明。该功能称为类扩展:

    //MyClass.h
    
    #import <UIKit/UIKit.h>
    
    @interface MyClass: UIViewController
    
    // Declare methods that other classes should call here
    
    @end
    
    //MyClass.m
    
    #import "MyClass.h"
    
    @interface MyClass () // <--- NOTE THE PARENTHESES HERE
    
    // Declare methods that only this class should be using here
    
    @end
    
    @implementation MyClass
    
    // Define all your methods here
    
    @end
    

    不,您不能在标题或其他任何地方声明“@privatemethods”。 Objective-C 中没有这样的东西。 @private 访问说明符仅适用于变量。

    【讨论】:

      【解决方案3】:
      • MyClass,不是myClass;类以大写字母开头。

      如果该代码完全编译,我会感到惊讶。如果在 .m 中,你要说:

      @interface MyClass()
      @end
      

      那将是一个类扩展,在 SO 上已经讨论过很多次了。实际上,您为 MyClass 声明了一个冲突的 @interface,编译器应该会抱怨。

      【讨论】:

      • 好吧,类不必以大写字母开头——这是标准约定(应该遵守),但编译器或任何其他 Xcode/iOS 组件不会强制执行。
      • 如果您不以大写字母开始课程,并且您要将所述代码作为编码示例提交给几乎任何体面的公司,他们很可能不会雇用您。你的选择。 ;)
      【解决方案4】:

      我已经多次在 .m 文件中声明内部类(与主类不同的名称)。这些将是 .m 包含的主类使用的类(并且在 .h 中声明)。这样,内部类是“私有的”,而且,所有这些都在一个文件中,在处理主类实现时更容易阅读和更新。

      【讨论】:

      • 建议;声明内部类时,在类名中添加__ 之类的后缀。这使得当内部类涉及回溯等时变得非常明显。我一直使用内部类——非常有用——并且通常也会使用类而不是结构。
      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      相关资源
      最近更新 更多