OC属性property:2-公共属性与专有属性
在自定义类中,既可以在.h文件中声明属性,也可以在.m文件中声明属性。在.h文件中声明的属性可以供外部调用,称为公共属性;在.m文件中声明的属性,即该类扩展中声明的属性,只能在该类的实现部分使用,称为专有属性。公共属性与专有属性的作用域是不同的,公共属性可以在整个工程中都被调用到,而专有属性只能在该类内部调用。
1、专有属性
在类实现的.m文件中,可以定义供类内部使用的专有属性。专有属性的作用域只限于本类,即只能够在该类的内部使用,外部无法访问。
当我们需要定义专有属性时,需要在类的.m文件中添加。专有属性定义的方法与公共属性时完全一致的,都包括:@property关键字、属性特性、属性类型以及属性名称4个部分构成。
#import "MYClass.h"
@interface MYClass ()
@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;
@end
当我们定义完成专有属性后,通常建议使用懒加载的方式,初始化专有属性。例如,上面示例中的firstName以及lastName两个专有属性,我们可以在懒加载过程中设置其初始值。
/**
* firstName懒加载
*
* @return firstName
*/
-(NSString *)firstName{
if (_firstName == nil) {
_firstName = [NSString stringWithFormat:@"www."];
}
return _firstName;
}
/**
* lastName懒加载
*
* @return lastName
*/
-(NSString *)lastName{
if (_lastName == nil) {
_lastName = [NSString stringWithFormat:@"99ios.com"];
}
return _lastName;
}
2、公共属性
公共属性的定义需要在类定义的.h文件中完成,公共属性是可以被外部进行访问和调用的。例如,我们在MYClass.h中定义一个name属性,该属性是公共属性,可以被程序外部访问。
#import <Foundation/Foundation.h>
@interface MYClass : NSObject
@property (nonatomic, copy) NSString *name;
@end
公共属性的初始化也可以通过懒加载的方式实现,例如,下方的代码实现了在.m文件中,使用懒加载初始化公共属性。另外,在初始化name属性的过程中,我们可以调用定义在.m中的专用属性。例如,在name属性的懒加载代码中,使用点语法获取firstName以及lastName属性的值,并进行拼接操作。
/**
* name公共属性懒加载,拼接firstName与lastName
*
* @return name
*/
-(NSString *)name{
if (_name == nil) {
_name = [self.firstName stringByAppendingString:self.lastName];
}
return _name;
}
3、外部调用公共属性
在代码的其他位置,只能访问定义在.h文件中的公共属性,不能访问专用属性,专用属性是只供本类内部使用的。在下方的示例代码中,在main()中实例化一个MYClass类型的对象,并访问其公共属性name。在MYClass类中,name属性的getter方法中访问了定义在MYClass.m中的两个专用属性firstName与lastName,并对两个专用属性的值进行拼接后返回。
#import <Foundation/Foundation.h>
#import "MYClass.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
MYClass *object = [[MYClass alloc] init];
NSLog(@"name初始值:%@",object.name);
}
return 0;
}
运行结果:
示例代码
https://github.com/99ios/3.2.2