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

来源:互联网 发布:centos 6.4更新 编辑:程序博客网 时间:2024/06/15 01:36

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

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

  • @property, 写在.h文件的@interface中,完成属性的声明
  • @dynamic或者@synthesize, 写在.m文件的@implementation中,完成属性是实现
  • @dynamic 意思是由开发人员提供相应的代码:对于只读属性需要提供 getter,对于读写属性需要提供 getter 和setter。@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。但有一种情况下, 声明属性是不会自动生成setter和getter方法的声明和对应的实例变量的。那就是手动在.m 中添加@synthesize 的时候。

@synthesize的作用:
1.实现了属性的name,age,number
2.规定了该属性声明的 setter getter 方法所操作的实例变量
3.如果@ synthesize 省略不写,则自动生成对应属性的 setter 和 getter 方法,默认操作的实例变量是属性名+’_’
4.检测对应的实例变量,如果没有找到认为生成的实例变量,则会自动生成对应的实例变量(‘_’ + 属性名)
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属性

0 0
原创粉丝点击