.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文件中声明的类,但是有一些细微的不同行为。 你可以用工厂模式来使用它