美文网首页
属性关键字

属性关键字

作者: 春暖花已开 | 来源:发表于2017-10-26 13:16 被阅读30次

@property的属性关键字有:readwrite、readonly、assign、weak、strong、retain、copy 、nonatomic、atomic
其中,
ARC:assign、weak、strong、copy、nonatomic、atomic
MRC:assign、retain、copy、nonatomic、atomic

1、assign(MRC/ARC)与weak(ARC):

The main difference between weak and assign is that the with weak, once the object being pointed to is no longer valid, the pointer is nilled out. Assigning the pointer the value nil avoids many crashes as messages sent to nil are essentially no-ops”

意思是说:weakassign多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为nil,这样再向weak修饰的属性发送消息就不会导致野指针操作crash。
所以,在ARC模式下编程时,指针变量一定要用weak修饰,例如delegate,一定要用weak修饰,而基本数据类型、结构体、枚举需要用assgin

2、NSString是用copy还是strong?
  • 当源字符串是NSString时,由于字符串是不可变的,所以,不管是strong还是copy属性的对象,都是指向源对象,copy操作只是做了次浅拷贝。

  • 当源字符串是NSMutableString时,strong属性只是增加了源字符串的引用计数,而copy属性则是对源字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。

  • 这里还有一个性能问题,即在源字符串是NSMutableString,strong是单纯的增加对象的引用计数,而copy操作是执行了一次深拷贝,所以性能上会有所差异。而如果源字符串是NSString时,则没有这个问题。

  • 所以,在声明NSString属性时,到底是选择strong还是copy,可以根据实际情况来定。不过,一般我们将对象声明为NSString时,都不希望它改变,所以大多数情况下,建议用copy,以免因可变字符串的修改导致的一些非预期问题。

3、Strong(ARC)(修饰对象)
  1. 直接赋值并且对象的引用计数器 +1 。
  2. 在 ARC 里替代了 retain 的作用 。
4、retain(MRC)

release 旧对象( 旧对象计数器 -1 ) ,retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 。

5、copy(MRC/ARC)

其中:

MRC下:

release 旧对象( 旧对象的引用计数器 -1 ) ,copy 新对象( 新对象的引用计数器 +1 ) ,然后指向新对象 。(新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)
如:

if (_dog) { 
[_dog release]; 
} 
_dog = [dog copy];
ARC下:

copy 新对象( 新对象的引用计数器 +1 ) ,然后指向新对象。
如:

_dog = [dog copy];
6、nonatomic (ARC/MRC)
  1. 不对set方法加同步锁 。
  2. 性能好。
  3. 线程不安全。
7、readonly (只读)
  1. 让 Xcode 只生成get方法 。
  2. 不想把暴露的属性被人随便替换时 ,可以使用 。
8、readwrite (读写)(默认)
  1. 让 Xcode 生成get/set方法 。
  2. 不用 readonly 修饰时 , 默认就是 readwrite 。

相关文章

  • OC属性关键字分析

    属性关键字: 读写权限类属性关键字:readonly 和 readwrite 原子性类属性关键字 : atomic...

  • Swift 3.0之十、属性

    1. 存储属性 存储属性包括变量存储属性(由var关键字修饰)和常量存储属性(由let关键字修饰)。 注意: 上面...

  • Kotlin:可变或者不可变的属性的使用

    一、声明属性 Kotlin类可以有属性,属性可以用关键字var声明为可变的,否则使用只读关键字val; 使用属性,...

  • OC基础知识点梳理

    属性关键字 1. 属性关键字都有哪些? 读写权限readonly(默认)readwrite 原子性atomic(默...

  • iOS 分类关联属性

    属性修饰关键字

  • iOS属性关键字

    iOS属性关键字 引言 学习 iOS 开发的人,大多都绕不开属性关键字—— assign,weak,unsafe_...

  • iOS9 新特性(20180325)

    1.关键字 关键字:可以用于属性,方法返回值和参数中 关键字的作用:提示作用,告诉开发者属性信息 关键字好处:提高...

  • this关键字

    this关键字 this关键字代表当前对象 this. 属性 操作当前对象的属性 this. 方法 调用当前对象的方法

  • Day08 Java面向对象——多态

    关键字super 1)super,相较于关键字this,可以修饰属性、方法、构造器2)super修饰属性、方法:在...

  • iOS readonly 属性赋值小记

    readonly 关键字用于属性的存取控制 ,如果不使用readonly ,编译器默认属性关键字为 readwri...

网友评论

      本文标题:属性关键字

      本文链接:https://www.haomeiwen.com/subject/zltkpxtx.html