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)
Shu*_*Ain 10
如果将.h限制为类的公共接口,然后将私有实现细节放在此类扩展中,则可以使项目更加清晰.
当您在ABC.h文件中声明变量方法或属性时,这意味着这些变量属性和方法可以在类外部访问
Run Code Online (Sandbox Code Playgroud)@interface Jain:NSObject { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end@Interface允许您声明私有ivars,属性和方法.因此,您在此处声明的任何内容都无法从此类外部访问.通常,您希望将所有ivars,属性和方法默认声明为private
简单地说,当您在ABC.m文件中声明变量方法或属性时,这意味着这些变量属性和方法无法在类外访问
Run Code Online (Sandbox Code Playgroud)@interface Jain() { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end