美文网首页
属性关键字

属性关键字

作者: 滨滨_57b5 | 来源:发表于2018-12-19 11:21 被阅读0次

属性关键字分类

  • 读写权限
  • 原子性
  • 引用计数

读写权限

  • readonly
  • readwrite(默认)

原子性

  • atomic(默认)

    atomic所修饰的对象是如何保证线程安全的?

所修饰的属性,保证赋值和获取是线程安全的
例如:对一个数组使用atomic进行修饰,当对数组进行赋值或者获取时是可以保证线程安全的,如果对数组进行删除或插入对象的操作,atomic就不能再保证其线程安全了

  • nonatomic

引用计数

  • retain(MRC)/strong(ARC):用于修饰对象
  • assign(即可修饰基本数据类型也可修饰对象类型)/unsafe_unretained(MRC)
  • week
  • copy

assignweek的区别?

  • assign可用来修饰基本数据类型,也可用来修饰对象类型,当不会改变其引用计数,assign在修饰对象时,对象释放时,assign指针仍然会指向原对象的内存地址,如果继续访问原对象,就会产生悬垂指针,导致内存泄漏和程序异常
  • week不改变被修饰对象的引用计数,用于解决循环引用,所指对象在被释放后会自动置为nil

week所修饰的对象在被释放时,为什么指针会自动置为nil?

内存管理相关

如果使用copy修饰可变数组会导致什么问题?
@property(copy)NSMutableArray *array;

  • 此问题涉及到了浅拷贝和深拷贝
  • 如果赋值过来的是可变数组NSMutableArray,copy是深拷贝,同时目标对象是不可变数组NSArray;
  • 如果赋值过来的是不可变数组NSArray,copy是浅拷贝,同时目标对象是不可变数组NSArray;
  • 由于原对象是可变的,可能会进行一些移除或插入的操作,此时由于copy的结果是不可变对象,如果此时进行移除或插入操作,就会引起程序异常


    1545188314631.jpg
  • 对于可变对象,无论进行copy还是mutablecopy都是深拷贝
  • 对于不可变对象,进行copy是浅拷贝,进行mutablecopy是深拷贝
  • 对于可变或不可变对象,进行copy,获取的目标对象都是不可变的
  • 对于可变或不可变对象,就行mutablecopy,获取的目标对象都是可变的
浅拷贝
未命名文件-2.png
深拷贝
未命名文件-2.png
浅拷贝VS深拷贝
  • 是否开辟了新的内存空间
  • 是否影响的引用计数

相关文章

  • 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/topdkqtx.html