.h和.m文件中的@interface定义之间的区别

通常我们使用

@interface interface_name : parent_class <delegates> { ...... } @end 

方法在.h文件和.m文件中,我们综合了在.h文件中声明的variables的属性。

但是在一些代码中,@interface ….. @ end方法也保存在.m文件中。 这是什么意思? 他们有什么区别?

同时给出一些关于.m文件中定义的接口文件的getter和setter的信息…

提前致谢

放置一个额外的@interface来定义一个包含私有方法的类别是很常见的:

Person.h:

 @interface Person { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)person; @end 

Person.m:

 @interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented. -(void)startThinkOfWhatToHaveForDinner; @end @implementation Person @synthesize name = _name; -(NSString*)makeSmallTalkWith:(Person*)person { [self startThinkOfWhatToHaveForDinner]; return @"How's your day?"; } -(void)startThinkOfWhatToHaveForDinner { } @end 

'private category'(无名类别的专有名称不是'private category',它是'class extension').m可以防止编译器警告这些方法已经被定义。 但是,因为.m文件中的@interface是一个类别,所以不能在其中定义ivars。

更新8月8日12:Objective-C已经发展,因为这个答案写成:

  • ivars可以在类扩展中声明(总是可以的 – 答案是不正确的)
  • @synthesize不是必需的
  • 现在可以在@implementation顶部的大括号中声明@implementation

    @implementation {id _ivarInImplmentation; } //方法@end

其概念是,如果将.h限制在您的类的公共接口,然后将私有实现详细信息放在此类扩展中,则可以使项目更清晰。

当你在ABC.h文件中声明variables方法或属性的时候,这意味着这些variables的属性和方法可以在类之外访问

 @interface Jain:NSObject { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end 

@Interface允许你声明私有的ivars,属性和方法。 所以你在这里声明的任何东西都不能从这个课堂以外的地方访问。 一般来说,你想声明所有的Ivars,属性和方法默认为私有的

简单地说,当你在ABC.m文件中声明variables方法或属性时,就意味着这些variables属性和方法不能在类之外访问

 @interface Jain() { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end 

你甚至可以在.m文件中创build其他的类,例如其他的小类,它们inheritance自.h文件中声明的类,但是有一些细微的不同行为。 你可以用工厂模式来使用它