2011-11-19 95 views
2

我只是不明白为什么有些人声明.m文件中的方法。不能这些声明只是在.h文件中?下面是我所看到的主要是:声明.h文件和.m文件中指定@interface和@end的方法之间的区别

//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中声明,不是吗?

+0

([在h和m文件@interface定义之间的差异]的可能重复http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m-file ) –

回答

4

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

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

正如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 

不,你不能在头宣布“@private方法”,或其他任何地方。 Objective-C中没有这样的东西。 @private访问说明符仅适用于变量。

+0

好的。谢谢你澄清... – Balaram

+0

优秀的答案..! –

2
  • MyClass而不是myClass;课程以大写字母开头。

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

@interface MyClass() 
@end 

然后,这将是一个类扩展,它已经在SO上讨论了很多次。实际上,您正在为MyClass声明冲突的@interface,并且编译器应该抱怨。

+0

嗯,类没有开始,一顶帽子 - 这是标准的约定(应观察到的),但不是由编译器或任何其他的Xcode/iOS的组件执行。 –

+2

如果不以大写字母开头的类和你提交所述码作为编码样本到几乎任何像样的公司,他们会很可能不会雇佣你。你的选择。 ;) – bbum

5

这是关于保持公共和私人界面之间的分离。

能够在实现文件中声明方法,属性和iVar是一个明确的指示,你可以在类中做什么和使用什么以及类可以做什么。

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

在.H

@property (readonly, copy) NSString *aString; 

在.M

@property (readwrite, copy) NSString *aString; 
从类中

,所以你可以把属性为读写,但外部的属性是只读。

0

我已经多次在.m文件中声明内部类(与主类不同)。这些将是由.m包含的主类所使用的类(以及在.h中声明的)。通过这种方式,内部类是“私人”的,此外,将它全部放在一个文件中,在处理主类实现时更容易阅读和更新。

+0

建议;在声明内部类时,为类名添加一个'__'后缀。这使得它完全明显,当一个内部类是参与回溯,等我用内部类所有的时间 - 非常有用 - 并且通常会使用一个类,而不是一个结构的,太。 – bbum

相关问题