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

80 getter setter interface objective-c header-files

通常我们使用

@interface interface_name : parent_class <delegates>
{
......
}
@end 
Run Code Online (Sandbox Code Playgroud)

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

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

还要提供一些关于.m文件中定义的接口文件的getter和setter的话.

提前致谢

Ben*_*hen 62

通常会添加@interface一个定义包含私有方法的类别的附加内容:

Person.h:

@interface Person
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

"私有类别"(无名类别的正确名称不是"私有类别",它是"类扩展").m可防止编译器警告方法已定义.但是,因为@interface.m文件中的类别是您无法在其中定义ivars.

更新于2012年8月6日:自从这个答案写成以来,Objective-C已经发展:

  • ivars 可以在类扩展中声明(并且总是可以 - 答案是不正确的)
  • @synthesize 不需要
  • ivars现在可以在顶部的括号中声明@implementation:

那是,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end
Run Code Online (Sandbox Code Playgroud)

  • @ giant91这个答案相当陈旧,编译器自最初编写以来已经有了很大的改进.如果方法体是"可见的",则编译器不再需要声明方法.这意味着类连续(`@interface className()`)通常现在只包含私有的`@ property`s. (5认同)
  • 小旁注,当你声明私有接口时,实际上并没有在括号中添加任何内容.否则,它只是创建一个类别,你不希望这样.`@interface Person()`就足够了. (4认同)
  • 如果人们有兴趣了解更多类别..这[页面](http://macdevelopertips.com/objective-c/objective-c-categories.html)对我来说非常有用. (4认同)

Shu*_*Ain 10

如果将.h限制为类的公共接口,然后将私有实现细节放在此类扩展中,则可以使项目更加清晰.

当您在ABC.h文件中声明变量方法或属性时,这意味着这些变量属性和方法可以在类外部访问

@interface Jain:NSObject
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end
Run Code Online (Sandbox Code Playgroud)

@Interface允许您声明私有ivars,属性和方法.因此,您在此处声明的任何内容都无法从此类外部访问.通常,您希望将所有ivars,属性和方法默认声明为private

简单地说,当您在ABC.m文件中声明变量方法或属性时,这意味着这些变量属性和方法无法在类外访问

@interface Jain()
    {
        NSString *_name;
    }

    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end
Run Code Online (Sandbox Code Playgroud)