OC @property和@synthesize小结

一、@property 是什么?

简单点说,属性就是一种支持访问对象成员变更的快捷的方法,可以自动的生成setter和getter方法.

面向对象思想的基本特点为封装、继承、多态
封装性主要体现在无法直接访问对象成员变量,如果需要的话,通过setter和getter方法访问成员变量。这样的话,通常要为每一个支持外边访问的成员变量写两个方法,这种操作比较繁琐且无意义。通过@property可以简化这种方法

声明:属性要在头文件中声明,声明格式为: @property (attributes) type propertyName;

实现(合成):实现要在.m文件中,格式为 @synthesize name = _name;

成员变量访问权限:头文件中声明的成员变量,默认是protected,.m文件中声明的成员变量,默认是private的。合成属性时,@synthesize propertyName = _name;如果变量_name没有声明,系统会自动生成该成员变量且为private权限。如果_name已声明,它们会自动合成

Class.h中

interface ClassA : NSObject {
    int _size; //默认为protected
    @public    //可以通过这种方式指定成员变量的访问权限
    int _name;
    int _length;
    @protected
    int _wight;
    @private
    int _num;
}
@property int name;
@property int length;
@end

Class.m中

@implementation ClassA{
    int _water;//此处声明的变量为private的
}
@synthesize name=_name;
//前者赋值给后者,若@synthesize name=_length;,即表示传入的name值赋值给length.
@end

注意:
1. 在xcode4.4以后的版本,系统会自动合成, 等价于自己写了代码“ @synthesize name = _name;” 。 也就是说如果没有特殊需求,只需要在头文件中声明而无需实现,就可以直接使用了。
2.如果没有告诉@propetry要传入的参数赋值给谁,默认@propetry会传入的属性赋值给_开头的成员变量.
3.@propetry不会对传入参数数据进行判断或过滤,如果需要判断或过滤,必须重写getter和setter方法.
4.如果利用@propetry来生成的getter和setter方法,可以不写成员变量,系统会自动生成一个_开头的成员变量.ps:@该成员变 量是私有的,是在.m文件中生成的,并不是.h文件中.
5.如果重写了setter,那么@property就只会生成getter方法.
6.如果重写了getter,那么@property就只会生成setter方法.
7.如果同时重写了setter和getter,那么@property不会自动帮生成私有成员变量

二、使用

声明一个属性,如果没有声明为只读的,它默认会生成两个方法 - (type)name 和 - (void)setName; 为了可读性等其它原因,也可以改变属性的setter和getter访问名称,

@property (setter=setMyValue, getter=getBool) NSInteger value; //会把setter名称变为setMyValue,getter名称变为getBool

这样的话就可以通过 [obj setMyValue:10] 和 [obj getBool]方法业访问成员变量了,此时setValue方法会被覆盖,不再存在。

三、@property的修饰属性(attributes )

格式: @propetry(属性修饰符) 数据类型 变量名称

例子:@property(readonly) int size;

可读性:readwrite / readonly ,不写的话默认为readwrite,即会合成setter和getter方法。

原子性:nonatomic / 【默认】,系统默认setter和getter为原子操作(没有atomic关键字),如果想设置为非原子操作,可以nonatomic。

内存 assign / retain / weak / strong ,在非ARC环境下, assign为默认,引用计数不变;retain引用计数加1;在引用计数环境下,默认为strong,与retain作用相同;从5.0系统后引入了weak,作用与assign相似,不过当所指向对象引用为0时,自动置为nil。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值