属性关键字

2018-07-13  本文已影响14人  蔚尼

一.属性关键字的分类?

  1. 读写权限:readonly、readwrite(默认)

  2. 原子相关:atomic(默认)、nonatomic(常用)
    aomic:可以保证赋值和获取是线程安全的。指的是成员属性直接的获取和赋值,不包括操作和访问。
    eg:用atomic修饰数组,获取和赋值保证线程安全,添加、移除对象,是不保证线程安全的。

  3. 引用计数

属性修饰符对retainCount计数的影响:

  1. alloc为对象分配内存,retainCount 为1 。
  2. retain(MRC下) retainCount + 1。
  3. strong: retainCount +1。
  4. copy 一个对象变成新的对象,retainCount为 1, 原有的对象计数不变。
  5. weak、assign不会改变引用计数器。
  6. release 对象的引用计数 -1。
  7. autorelease 对象的引用计数 retainCount 如果为0,等到最近一个pool结束时释放。

retain

retain下的setter方法:

-(void) setName: (id) nameStr
{
      if (name != nameStr) {
        [name release];
        name = [nameStr retain];
     }
}

strong

copy

copy下的setter方法:

-(void)setName: (id)newName {
      if (name != newName) {
        [name release];
        name = [newName copy];
     }
}

用copy修饰block时在MRC和ARC下的区别
MRC环境下
(1)block访问外部局部变量,block存放在栈里面。
(2)只要block访问整个app都存在的变量,那么肯定是在全局区。
(3)不能使用retain引用block,因为block不在堆区里面,只有使用copy才会把block放在堆区里面。

ARC环境下
(1)只要block访问外部局部变量,block就会存放在堆区。
(2)可以使用strong去引用,因为本身就已经存放在堆区了。
(3)也可以使用copy进行修饰,但是strong性能更好。

assign:

assign下的setter方法:

-(void)setName :(id)str
{
       name = str;
}

weak

assign和weak的区别?(面试)

  1. 都不会改变引用计数;
  2. assign即可修饰对象,又可修饰基本数据类型;weak只可以修饰对象;
  3. assign修饰的对象在被释放之后,指针仍旧指向之前的内存地址;weak所指向的对象被释放之后会自动指为nil

二.深拷贝、浅拷贝

参考:iOS 集合的深复制与浅复制

1.copy和mutableCopy

不管是集合类对象,还是非集合类对象,接收到copy和mutableCopy消息时,都遵循以下准则:

  1. copy返回imutable(不可变)对象;所以,如果对copy返回值使用mutable对象接口就会crash;
  2. mutableCopy返回mutable对象;

问: @property(copy) NSMutableArray * array; 这样写会出现什么问题?面试考点
被赋值过来的不管是可变、不可变数组,都生成不可变数组。对这个array进行增删改会崩溃。

2.深拷贝、浅拷贝

如下图,对象拷贝有两种方式:浅拷贝和深拷贝。

深浅拷贝

只有对immutable(不可变)对象进行copy操作,是浅拷贝、指针复制。其他都是深拷贝、内容复制。

2.1 在非集合类对象中

用代码简单表示如下:
[immutableObject copy]—》得到不可变对象 // 浅复制,指针复制
[immutableObject mutableCopy] –》得到可变对象 //深复制,内容复制
[mutableObject copy] –》得到不可变对象 //深复制:内容复制
[mutableObject mutableCopy] –》得到可变对象//深复制:内容复制

2.2 在集合类对象中

[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制

集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。
单层深复制的意思:数组指针指向新的内存,但是数组中的元素还是指向原来的指针。

3.查看内存地址的方式

内存地址查看方式

补充:面试考点

三. nonatomic/atomic

1.nonatomic 非原子属性。**

它的特点是多线程并发访问性能高,但是访问不安全;
与之相对的就是atomic,特点就是安全但是是以耗费系统资源为代价,所以一般在工程开发中用nonatomic的时候比较多。

2. atomic

系统默认的是atomic,为setter方法加锁,而nonatomic 不为setter方法加锁。
注意atomic设置成员变量的@property属性,提供多线程安全。在多线程中,原子操作是必须的。加入atomic属性修饰符以后,setter函数会变成下面这样:

atomic

之所以这么做,是因为防止在写未完成的时候被另外一个线程读取,造成数据错误。

参考:
iOS 集合的深复制与浅复制

ios中属性修饰符的作用

iOS内存管理 之 strong与copy之间的区别

上一篇 下一篇

猜你喜欢

热点阅读