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

OC属性property:1-属性定义

属性property在类定义中使用非常普遍,属性定义后,会创建一个与该属性名称同名且带下划线的实例变量,与此同时,编译器会根据属性的特性,自动合成该属性对应实例变量的存取方法(getter和setter方法)。

1、属性中的一些概念

在深入了解Objective-C的属性之前,我们首先需要了解一下与属性相关的一些基本概念。

  • 属性property:通常指的是由对象封装或者存储的数据,例如对于UIView视图类对象,可以具有多个描述该视图类的属性,例如:大小、位置、颜色、是否可以响应用户交互等等。

  • 存取方法setter/getter:设置/获取该类的对象的属性值,执行设置/获取操作的方法称为存取方法;

  • getter方法:返回属性的值,名称与属性名相同。在实际开发中,常说的懒加载(lazy loading)就是getter方法;

  • setter方法:设定属性的值,setter方法的形式为setPropertyName:,其中属性名称的第一个字母大写。

2、属性的声明

当在类中声明一个属性时,需要在类的@interface代码部分编写,格式如下:

@property (attributes) type name;

其中:

  • @property: 属性定义关键字;

  • attribute:属性的特性,提供了该属性的存储方式以及属性行为的说明,常见的关键字有: weak/strong, assign, copy, atomic/nonatomic,有关属性关键字的说明后续章节会详细介绍;

  • type: 属性的类型说明,如:NSString, NSNumber,int, CGfloat以及一些自定义类;

  • name:属性的名称,属性的名称命名需要遵守驼峰法则。

例如,我们可以创建一个MYClass类,并且在其中添加一些属性,这些属性的类型包含了基本数据类型,Foundation框架中定义的类型,自定义类以及id类型。:

#import <Foundation/Foundation.h>
#import "Player.h"

@interface MYClass : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic,assign) int age;
@property (nonatomic,strong) Player *player;
@property (nonatomic,weak) id delegate;

@end

3、属性的实现

在类定义中声明的属性,编译器会自动生成一个与该属性同名且带下划线的一个实例变量,同时自动生成该实例变量的存取方法。一般情况下,建议只在该对象的存取方法中,才直接访问该实例变量。

当需要对对象的属性进行操作时,都建议使用“点语法”来直接获取属性的值或者设置属性的值。对对象的属性进行的操作主要包括两类:

  • 获取属性的值:在点语法中使用objectName.properyName来获取属性的值,其本质上是调用了属性对应的getter方法;

  • 设置属性的值:在点语法中使用objectName.properyName = value,来给属性直接设值,其本质上是调用了属性对应的setter方法(注意一点,属性定义中包含readonly关键字的属性是不能设置值的)。

#import "MYClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MYClass *object = [[MYClass alloc] init];
        //获取属性的值,getter方法
        NSLog(@"name属性初始值:%@",object.name);
        //设置属性的值,setter方法
        object.name = @"九九学院";
        NSLog(@"name属性最新值:%@",object.name);
    }
    return 0;
}

运行结果:

懒加载

在iOS开发过程中,经常会使用属性的懒加载,所谓懒加载就是当需要获取某个属性的值时,再对该属性对象的实例变量进行初始化,从而提升内存的使用效率。懒加载其实就是对属性的getter方法进行重写操作,在懒加载过程中,我们可以对属性进行一些初始化的操作。例如,使用懒加载初始化name属性,在初始化时给其赋值,其中**_name**是name属性对应的实例变量;

-(NSString *)name{
    if (_name == nil) {
        _name = [NSString stringWithFormat:@"www.99ios.com"];
    }
    return _name;
}

示例代码

https://github.com/99ios/3.2.1