通常我们使用
@interface interface_name : parent_class <delegates>
{
......
}
@end
.h文件和.m文件中的方法,我们综合了.h文件中声明的变量的属性。
但是在某些代码中,此@interface ..... @ end方法也保留在.m文件中。这是什么意思?它们之间有什么区别?
还提供一些有关.m文件中定义的接口文件的getter和setter方法的信息...
提前致谢
Answers:
通常会添加一个额外的东西@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
class extension
不”category
@interface className ()
)现在通常只包含private @property
。
其概念是,如果将.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
您甚至可以在.m文件中创建其他类,例如,其他小类,它们继承自.h文件中声明的类,但行为有所不同。您可以在工厂模式下使用它
@interface Person ()
就足够了。