通常我们使用
@interface interface_name : parent_class <delegates>
{
......
}
@end
在.h文件和.m文件中的方法中,我们合成了在.h文件中声明的变量的属性。
但是在某些代码中,这个@interface ..... @ end方法也保存在.m文件中。这是什么意思?他们之间有什么区别?
还要为.m文件...
中定义的接口文件提供有关getter和setter的一些说法先谢谢
答案 0 :(得分:61)
通常会添加一个@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
“私有类别”(无名类别的正确名称不是“私有类别”,它是“类扩展名”).m可防止编译器警告方法已定义。但是,由于.m文件中的@interface
是一个类别,因此无法在其中定义ivars。
2012年8月6日更新:自从这个答案写完以来,Objective-C已经发展了:
ivars
可以在类扩展中声明(并且总是可以 - 答案不正确)@synthesize
不是必需的ivars
现在可以在@implementation
顶部的大括号中声明:即
@implementation {
id _ivarInImplmentation;
}
//methods
@end
答案 1 :(得分:9)
如果您愿意,可以让您的项目更加清洁 将.h限制为你的类的公共接口,然后放入 此类扩展中的私有实现详细信息。
在ABC.h文件中声明变量方法或属性时,它 意味着这些变量属性和方法可以在外部访问 班级
@interface Jain:NSObject { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end
@Interface允许您声明私有ivars,属性和 方法。因此,您在此处声明的任何内容都无法从外部访问 这个班。通常,您要声明所有ivars,属性和 方法默认为私有
简单地说当你在ABC.m中声明变量方法或属性时 文件,这意味着这些变量的属性和方法不可能 在课堂外访问
@interface Jain() { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end
答案 2 :(得分:0)
你甚至可以在.m文件中创建其他类, 例如,从.h文件中声明的类继承但具有一些轻微不同行为的其他小类。 您可以在工厂模式中使用它