我只是不明白为什么有些人在.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中声明,不是吗?
答案 0 :(得分:5)
这是关于保持公共和私人接口之间的分离。
能够在实现文件中声明方法,属性和iVars是一个明确的指示,指示您可以在课堂上执行和使用的内容,以及可以从课外进行的操作。
您还可以重新声明属性。例如:
在.h
@property (readonly, copy) NSString *aString;
<。> in .m
@property (readwrite, copy) NSString *aString;
因此,在您的类中,您可以将该属性视为readwrite,但在外部,该属性是readonly。
答案 1 :(得分: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
访问说明符仅适用于变量。
答案 2 :(得分:2)
MyClass
,而不是myClass
;课程以大写字母开头。如果该代码完全编译,我会感到惊讶。如果在.m中,你要说:
@interface MyClass()
@end
然后那是一个类扩展,已在SO上多次讨论过。事实上,你是为@interface
声明一个有冲突的MyClass
,编译器应该抱怨。
答案 3 :(得分:0)
我曾多次在.m文件中声明内部类(与主类不同地命名)。这些将是.m包含的主类使用的类(并且在.h中声明)。这样内部类就是“私有”,而且,在一个文件中,它在处理主类实现时更容易阅读和更新。