关键字@synthesize 和@property

来源:互联网 发布:物联传感 知乎 编辑:程序博客网 时间:2024/05/16 19:27

一直在使用属性,但是很长一段时间都不明白@property 关键字和@synthesize 到底是怎样搭配使用的,今天终于让我发现了他们之间的关系;

举个栗子:
@property (nonatomic,strong) NSString *name;
//第一步生成_name属性
//第二步为_name属性自动生成set/get方法

然后我们回到 m 文件中,在没有 @synthesize name; 的情况下:

    self.name = @"123";    NSLog(@"%@",self.name);    self ->_name = @"456";    NSLog(@"%@",self->_name);    _name = @"231";    NSLog(@"%@",_name);    self ->name = "643";    NSLog(@"%@",self -> name);    name = @"321";    NSLog(@"%@",name);

只有前三种方法可以使用,也就是说,_name 变量可以直接使用,而 name 这个变量是不可以直接使用的。

我们在来看看有 @synthesize name; 的情况:

    self.name = @"123";    NSLog(@"%@",self.name);    name = @"321";    NSLog(@"%@",name);    self ->name = @"643";    NSLog(@"%@",self -> name);    _name = @"231";    NSLog(@"%@",_name);    self ->_name = @"456";    NSLog(@"%@",self->_name);

同理,也是只有前三种方法可以使用,即 name 变量可以直接使用,而 _name 却不可以使用。

看到这,估计大家都明白了,@synthesize 关键字 可以将你所 定义的变量变成你自己的变量,而不是 系统自己生成的 _XXX 这种类型的变量。

但是为什么@synthesize 有这个功能呢,这就不得不说它的另一个功能,修改变量名称:
我是另一个栗子:
//有时候我们不想定义属性为_XXX这种格式
//这时候我们就可以使用@synthesize,来将属性名修改我们想要的属性名
//这时候属性_name变成了Othername;
@synthesize name = Othername;

根据这种用法来看,@synthesize 好像是把_name 改了个名 name 呢!
(不过,真是奇了怪了,我用@synthesize name = $name 竟然也可以编译成功,说好的除了下划线,其他的都不可以呢???)

一:接下来是来声明一下相关 关键字的概念吧:
1.存取器函数:
存储器函数是专门用来供对象的使用者设置或获取对象中值的一个方法。他们封装了对象的数据成员并对外隐藏了对象的实现细节。存取器函数可以直接访问变量,或者在访问时进行一些计算。有时,这些方法也称为赋值函数(setter)和取值函数(getter)。
2:对象 的 状态
对象由状态和行为组成。状态包含构成对象的数据。在考虑对象的状态时,一般遵循设计规则:虽然可以在任何时候改变对象的状态,但状态设定后直至应用程序改变它为止一直保持状态是比较安全的。改变一个对象的状态却造成副作用是一种不好的做法。
3:对象的行为
行为可以看作是对象执行的操作,行为可以用于更新其他对象,因此也有副作用,或者也可以用于改变对象的内部数据或者触发对象上的其他操作。
4:@synthesize
@synthesize 指令会使得编译器生成为属性创建存储器函数所需的所有代码,本质上,该指令是属性的“替代品”。如果使用@synthesize指令,不需要在实现文件中为属性写任何代码。
使用@synamic 指令创建存储器函数时,应该确保存储器函数履行了在属性的特性中指定的约定。换句话说,如果指定的是 copy 特性,就必须确保存储器函数在设置属性时赋值传入的值。
为了使用编译器自动生成的存取器方法,在实现文件的实现块中属性必须要有一个声明。
5:@dynamic
@dynamic 指令: 如果想手动创建存储器函数,现在或者之后动态加载到运行时环境中,可以使用该指令。在使用该指令时,编译器会指望你为属性创建一对合适的存储器函数。

二 :属性的特征

getter=,setter= 指定该属性所使用的存储器函数的名称

assign 生成的赋值函数是简单的为变量赋值。

retain 生成的赋值函数在赋值到变量时会保留传入的参数。setter 方法对参数进行release旧值,

copy 生成的存储器函数会复制传入值到成员变量。

nonatomic 指定生成的存储器函数是非原子性的,即非线程安全的。使用多线程,有时会出现两个线程互相等待对方导致对方锁死的情况。禁止多线程,变量保护,提高性能。

atomic 会纺织这种线程互斥出现,但是会消耗一定的资源。所以不是多线程的程序不用。

strong 该属性值对应的 _strong 关键字,即该属性所声明的变量将成为对象的持有者。

weak 该属性对应的 _weak 关键字,与_weak 定义的变量一致,该属性所声明的变量没有对象的所有权,并且当对象被抛弃之后,对象将被自动赋值 nil。

0 0
原创粉丝点击