属性详解(@property/@dynamic/@synthesize)

上一篇文章讲到, OC 2.0之后属性一旦声明,如果没有readonly修饰的话,当前类自动生成了setter和getter方法的声明, 并且会自动生成对应的实例变量(下划线 + 属性名)。而setter和getter就是访问这个实例变量的方法。

@property分为@property 和@dynamic或者@synthesize:

  • @property, 写在.h文件的@interface中,完成属性的声明
  • @dynamic或者@synthesize, 写在.m文件的@implementation中,完成属性是实现
  • @dynamic 的意思是告诉编译器, 该属性的实例变量和存取方法由用户自己实现, 不自动生成。
  • @synthesize 意思是,由编译器自动添加默认的实例变量并生成相应的存取代码,以满足属性声明。
//.h 文件中
@property (nonatomic)NSInteger age;
@property (nonatomic,copy)NSString *name;
@property (nonatomic,retain)NSNumber *number;

//.m 文件中
@synthesize name = _name ,age = _age ,number = _number;
//该语句不写就是默认自动生成的,代表所有 setter 和 getter 方法的实现

在平时的使用中, 在.h 中进行 @property 后, 会自动在.m 中生成相对应的@synthesize。

@synthesize的作用:
添加属性对应的成员变量
2.规定了该属性声明的 setter getter 方法所操作的成员变量
3.如果@ synthesize 省略不写,则自动生成对应属性的 setter 和 getter 方法,默认操作的成员变量是’_’+属性名
4.若你手动实现了@synthesize, 就会按照你的要求生成成员变量名称并生成对应的setter getter 方法, 如@synthesize name = _myName; 这样成员变量就是_myName
5.在以下几种情况不会自动合成setter和getter方法, 而且也不会检测成员变量是否存在,也就不会帮助我们生成对应的成员变量,则需要我们自己添加成员变量: 1>同时重写了 setter 和 getter 时; 2>重写了只读属性的 getter 时; 3>使用了 @dynamic 时; 4>在 @protocol 中定义的所有属性; 5>在 category 中定义的所有属性; 6>重写的属性, 当你在子类中重写了父类中的属性,你必须使用 @synthesize 来手动合成ivar。


关于@property 的说明:
1.读写特性
(1)readwrite (可读可写)默认属性,既生成setter方法,又生成gette方法
(2)readonly (只读),只生成getter方法,不会生成setter方法
(3)setter = 方法名,给生成的setter方法起一个其他的方法名
(4)getter = 方法名,给生成的getter方法起一个其他的方法名

2.原子特性
(1)atomic (原子特性)默认属性,保证线程安全,也就是当前的实例变量只能由一个线程访问,在这个过程中有一个加锁解锁的过程

3.语义特性
(1)assign 默认属性,一般用来修饰非对象类型的属性
(2)retain 针对于对象,会将对象的引用计数+1
(3)copy 针对于对象,将对象拷贝一份,产生一个新的对象
//注: 一般的 NSString/block需要为其属性添加copy的属性,其他对象添加retain属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值