免费开源的iOS开发学习平台

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