一、声明方式的变化
在iOS5.0 以前需要这样写:
@interface ViewController ()
{
// 1.声明成员变量
NSString *name;
}
//2.在用@property
@property(nonatomic, copy) NSString *name;
@end
@implementation ViewController
//3.最后在@implementation中用synthesize生成set方法
@synthesize name;
@end
iOS5.0以前,属性的正常写法需要成员变量+ @property + @synthesize 成员变量三个步骤。
@property声明的属性不仅仅默认给我们生成一个_类型的成员变量,同时也会生成setter/getter方法。
在iOS5.0 以后的写法
//属性变量
@property(nonatomic, strong) NSString *name;
发生这种状况根本原因是苹果将默认编译器从GCC转换为LLVM(low level virtual machine),才不再需要为属性声明实例变量了。
二、成员变量与属性变量的区别
1. 成员变量
@interface ViewController : UIViewController
{
//成员变量
NSString *name;
}
成员变量是申明在@interface{ }之间的变量;
成员变量不会生成set、get方法,外界无法与成员变量接触,所以成员变量只能在本类中使用,是属于类内部的变量;
在这段代码里面只是声明了一个成员变量,并没有setter/getter方法。所以访问成员变量时,可以直接访问name,也可以像C++一样用self->name来访问,但绝对不能用self.name来访问。
2. 属性变量
//属性变量
@property(nonatomic, strong) NSString *name;
属性变量是以@property关键字声明的变量;
属性变量会自动生产set、get方法,定义在.h文件中的属性变量可以供外界访问;
在.m文件中,编译器也会自动的生成一个实例变量 _name。那么在.m文件中可以直接的使用 _name 实例变量,也可以通过属性self.name都是一样的。
点表达式(.)看起来与C语言中的结构体访问以及java语言汇总的对象访问有点类似,如果点表达式出现在等号的左边,调用该属性名称的setter方法。如果点表达式出现在的右边,调用该属性名称的getter方法。
OC中点表达式(.)其实就是调用对象的setter和getter方法的一种快捷方式,self.myString = @”张三”; 实际就是 [self setmyString:@”张三”];
3. 作用范围
成员变量只能在本类中使用,是属于类内部的变量,外界无法访问;
属性变量声明在.h文件里,能够被外界访问;如果什么在.m文件里,也只能在本类使用。
三、属性变量的修饰词
atomic: 原子性
在objective-c 属性设置里面 默认的就是atomic ,意思就是 setter
/getter函数是一个原子操作,如果多线程同时调用setter时,不会出现某一个线程执行完setter所有语句之前,另一个线程就开始执行setter,相当于
函数头尾加了锁 . 这样的话 并发访问性能会比较低 .
nonatomic: 非原子性
非原子操作 一般不需要多线程支持的时候就用它,这样在 并发访问的时候效率会比较高 .
在objective-c里面通常对象类型都应该声明为非原子性的.
iOS中程序启动的时候系统只会自动生成一个单一的主线程.程序在执行的时候一般情况下是在同一个线程里面对一个属性进行操作.
getter=getterName
指定 get 方法,并需要实现这个方法 。必须返回与声明类型相同的变量,没有参数.相当于重新命名getter方法
setter=setterName
指定 set 方法,并需要实现这个方法 。带一个与声明类型相同的参数,没有返回值(返回空值)
readwirte
如果没有声明成 readonly ,那就 默认是 readwrite 。可以用来赋值,执行set方法
readonly
不可以被赋值
assgin
通常用于标量(简单变量 int , float , CGRect 等) 一种典型情况是用在对对象没有所有权的时候,通常是 delegate
,避免造成死循环(如果用 retain 的话会死循环)
strong
释放旧对象 将旧对象的值赋予输入对象 ,再提高输入对象的索引计数为 1 ,常使用在继承自 NSObject 的类。(MRC为retain)
weak
weak 不增加对对象的引用计数,也不持有对象,因此不能决定对象的释放。它比 assign 多了一个功能,当对象消失后自动把指针变成 nil
copy
建立一个索引计数为 1 的对象 然后释放旧对象 对 NSString 它指出 ,在赋值时使用传入值的一份拷贝 ,拷贝工作由 copy
方法执行,此属性只对那些实行了 NSCopying 协议的对象类型有效。