Skip to content

Latest commit

 

History

History
126 lines (89 loc) · 2.57 KB

Property.md

File metadata and controls

126 lines (89 loc) · 2.57 KB

#属性

我们之前都是通过手动编写setter以及getter方法来进行成员变量的访问,而属性就可以便利的为我们提供这些,并且属性会自动生成带下划线的成员变量。

##格式如下

// 在Person.h文件增加了两个属性

@interface Person : NSObject

@property NSString *firstName;
@property NSString *lastName;


@end

申明这两个属性之后,我们就可以直接使用getter以及setter方法,或者直接使用点语法

##get&set

Person *person = [[Person alloc] init];
// getter
NSString *firstName = [person firstName];
// setter
[person setFirstName:@"Jone"];

##关键字讲解

 @property

 第一类:内存管理相关
     assign  :  缺省值   修饰基本数据类型和delegate对象
     retain  :  对象类型
     copy    :  对象类型(在遵守<NSCoping>情况下)
 第二类:线程相关
     atomic   :   缺省值 ,关心线程安全,通常用于多线程中
     nonatomic:  不关心线程安全,通常用于单线程中
 第三类:
     readwrite: 读写 缺省值
     readonly:  只读  (只提供getter方法,不提供setter方法)

 getter 、setter:重定义getter和setter方法名

 ARC模式下:
 weak   相当于  assign   相当于,但不等价 注意
 strong 相当于  retain   相当于

##自定义合成变量名

在iOS5之后,如果不进行变量名合成,系统会自动生成带下划线的成员变量,接下来我们自定义合成变量名

在Person.m我们可以看到可以直接使用_firstName;

@implementation Person
- (instancetype)init
{
    self = [super init];
    if (self) {
    // 使用系统生成的带下划线的名字
        _firstName = @"hello";
    }
    return self;
}

@end

如果自定义该变量名就使用@synthesize关键字,示例:

@implementation Person
// 重新合成名字
@synthesize firstName = first;
- (instancetype)init
{
    self = [super init];
    if (self) {
    // 使用合成的名字
        first = @"hello";
    }
    return self;
}
@end

大家可以实验,如果当前我创建一个Student类继承与Person类,那么在里面无法使用_firstName

  _firstName = @"asdf";
  // 报错原因
  Use of undeclared identifier '_firstName'

这个时候如果使用上面的关键字就可以解决,否则就使用self.firstName,下面解决方法

@implementation Student

@synthesize firstName = _firstName;

- (instancetype)init
{
    self = [super init];
    if (self) {
        _firstName = @"asdf";

    }
    return self;
}

@end