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


81

通常我们使用

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

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

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

还提供一些有关.m文件中定义的接口文件的getter和setter方法的信息...

提前致谢

Answers:


63

通常会添加一个额外的东西@interface来定义包含私有方法的类别:

人.h:

@interface Person
{
    NSString *_name;
}

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

人.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防止编译器警告已定义方法。但是,由于@interface.m文件中的。是一个类别,因此无法在其中定义ivars。

12年8月6日更新:自编写此答案以来,Objective-C不断发展:

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

那是,

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end

4
小旁注,声明私有接口时,请不要在括号中放任何内容。否则,它只会创建一个类别,而您并不需要。@interface Person ()就足够了。
Itai Ferber

感谢itaiferber,我没有注意到。我已经更新了答案。
本尼迪克特·科恩

4
如果人们有兴趣了解更多有关类别的信息,则此页面对我非常有用。
蒂姆(Tim)

1
如果方括号中没有任何内容,则实际上称为“class extension不”category
Paul.s 2012年

5
@ giant91这个答案相当老,自最初编写以来,编译器已经得到了很大的改进。如果方法主体为“可见”,则编译器不再需要方法的声明。这意味着类继续(@interface className ())现在通常只包含private @property
本尼迪克特·科恩

10

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

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

@interface Jain:NSObject
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end

@Interface允许您声明私有的ivars,属性和方法。因此,您在此声明的所有内容都不能从此类外部访问。通常,您要默认将所有ivars,属性和方法声明为private

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

@interface Jain()
    {
        NSString *_name;
    }

    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.