知识梳理之@property属性

一、简单介绍

1.原子性

atomic(默认):意为操作是原子的,当我们什么都不写的时候,默认就是这个。说明该成员变量是线程同步的。但是很少、几乎用不到,比较影响性能、效率。

nonatomic:与atomic正好相反,意为操作是非原子的,非线程同步,基本都在使用这个。

2.存取器控制


readwrite(默认):意为该属性同时拥有setter 和getter。

readonly: 意为该属性是只读的,表示只有getter没有setter。

getter = mothod / setter = mothod:有时候为了使语义更加的明确自定义访问器名称。


- (NSString *)myGetter {
          return _name;
}

还有最常见的就是BOOL类型,一般是这样写。
例如:
@property (nonatomic, getter = isOn) BOOL on;
PS: setter = mothod 不常用也不推荐大家使用。

3.内存管理


assign(默认):属于值类型,非对象类型一般使用,如int、float、double、NSIntger、CGFloat等,表示单纯的复制。另外不存在所有权关系的对象,比如delegate也使用此关键字。
以下两段代码是一样的:

@property(nonatomic) int index;
@property (nonatomic, assign)int index;
  • strong:能都维持对象的生命,表示实例变量对传入的对象有所有权关系,也就是强引用。
  • weak:弱引用,表示对传入的对象没有所有权,,当该对象的引用计数为0时,对象被释放后,用weak声明的实例变量指向nil。
  • copy:也就是复制或者克隆,它与strong类似,区别在于对于实例变量是对传入的对象副本拥有所有权,并非对象本身。
  • unsafe_unretained(不常用):unretained与weak类似都不会影响对象的引用计数,但是对象被释放后unretained不会指向nil.

二、开发中的应用

1.开发中用@property声明NSString、NSArray、NSDictionary时常常使用copy关键字,这么做达到拷贝的目的“改变原理的内容不影响副本,改变副本也不影响原来的内容”,防止如果外界修改变量时的影响。

2.同样block作为属性是也用copy。

3.不要将copy关键字用到NSMutableString、NSMutableArray、NSMutableDictionary等可变对象上,要用Strong关键字。

大家可以这样试试

NSMutableArray *muArray = [NSMutableArray arrayWithObject:@“试试"];
self.mutableArray = muArray;
[self.mutableArray addObject:@“试试就试试"];

结果程序会崩,哈哈.
原因是,通过copy修饰的property,若通过self.someArray =来赋值初始化,则是通过系统合成setter方法实现,由于设置copy修饰词,则返回实际上是不可变数组(NSArray),当调用addObject 方法会报错。

但是如果改成这样呢?

@property (nonatomic, copy) NSMutableArray *mutableArray;
NSMutableArray *muArray = [NSMutableArray arrayWithObject:@“试试"];
_mutableArray = muArray;
[self.mutableArray addObject:@“试试就试试"];

结果会怎样呢?答:程序不会奔溃.
原因是:
_mutableArray是实例变量,实例变量并没有 copy 修饰,指向的仍是定义的 NSMutableArray 类型。所以即使后面通过 self. mutableArray 使用 addObject 方法仍然可行,因为初始化赋值阶段获取的是NSMutableArray类型对象,所以程序不会奔溃
从上述可看出对于可变对象我们需要用strong关键字,就不会出现以上的情况。

4.weak关键字常用于delegate和Qutlet

PS:上述内容只是做个简单的介绍和使用,感兴趣的话可以往深了研究研究,挺有意思的,写这些目的就是梳理一下自己的知识,不足的地方欢迎大家指正。
谢谢

你可能感兴趣的:(知识梳理之@property属性)