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

时间:2010-10-19 09:59:37

标签: objective-c interface header-files setter getter

通常我们使用

@interface interface_name : parent_class <delegates>
{
......
}
@end 
在.h文件和.m文件中的

方法中,我们合成了在.h文件中声明的变量的属性。

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

还要为.m文件...

中定义的接口文件提供有关getter和setter的一些说法

先谢谢

3 个答案:

答案 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文件中声明的类继承但具有一些轻微不同行为的其他小类。 您可以在工厂模式中使用它