@property的详细介绍

2018-04-26  本文已影响0人  陌巷先森

一、@property的本质是什么?

@property就是在编译阶段由编译器自动帮我们生成ivar实例变量,getter方法,setter方法;
属性(property)有两个概念:ivar(实例变量)、存取方法(access method = getter + setter)。当声明一个属性(property)的时候编译器会自动生成相关的getter和setter方法,除此之外,编译器还要自动向类中添加成员变量(在属性名前面加上下划线以此作为实例变量的名字);
在一个新建的Student类中通过@property声明了一个name属性

@interface Student : NSObject
@property(nonatomic, copy)NSString *name;
//等于与以下写法
{
    //ivar
    NSString *_name;
}
// setter
- (void)setName:(NSString *)name;
// getter
- (NSString*)name;
@end

属性(property)还提供了一些特殊的关键字来进行声明,包括assign(vs copy),weak(vs strong), atomic(vs nonatomic),readwrite(vs readonly)等。

二、@synthesize 和 @dynamic有什么作用?

@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果两个都没写,系统默认@synthesize var = _var;
@synthesize表示为属性自动生成相关的getter方法和setter方法;如:

@synthesize name = _name或@synthesize name

@dynamic告诉编译器属性的getter方法和setter方法由用户自己实现,不自动生成。如果没有提供相应方法,当程序运行到instance.var = someVar时由于缺少setter方法会导致程序崩溃;或者当运行到someVar = var时,由于缺少getter方法同样会崩溃。

@dynamic name;
//当使用@dynamic时,可以通过在.h文件中声明私有变量来实现
{
    @private
    __strong NSString *_name;
}

三、由于有了自动合成属性实例变量,@synthesize还有哪些使用场景?

首先应该清楚什么情况下不会自动合成实例变量:

当你在子类中重载了父类的属性,你必须使用@synthesize来手动合成ivar。

四、property的指示符

参考:完整项目资料下载

上一篇 下一篇

猜你喜欢

热点阅读