【OC】属性的特殊指示符

前言

  经过对OC的阶段性学习,我们iOS小组进行了组内考核,在考核编写代码时,我对属性的特殊指示符的使用较为生疏和模糊,特写此博客用作学习笔记。

概述

OC中的特殊指示符主要分三种:

特性种类意义指示符
多线程特性表示属性是否为原子操作(即是否线程安全),也可以理解为属性是否适合在多线程的场景下使用nonatomic(默认值)和atomic
读写特性表示属性是否可读或可写readwrite(读写,默认值),readonly(只读)
内存管理特性用于给ARC(自动引用计数)做指示,方便ARC回收内存strong(强引用,默认值),weak(弱引用),copy和unsafe_unretained

OC中常用的特殊指示符

  在Objective-C中,我们使用@property关键字来定义属性,这些属性可以有多种关键字来修饰,以下是一些常见的属性关键字及其特殊指示符:

1.assign: setter方法的实现是直接赋值,一般用于基本数据类型,如NSInteger、BOOL、int、float等;修饰对象类型时,不增加其引用计数;使用assign修饰的对象在被释放之后,指针仍然指向原对象,会产生悬垂指针。用法示例:

@property (nonatomic, assign) NSInteger age;

2.nonatomic: 非原子操作,即多线程访问时不加锁,提高了性能,但在多线程环境下也有可能出问题。示例如下:

@property (nonatomic, copy) NSString* name;

3.copy: setter方法的实现是生成一个复制对象,常用于NSString类型,可以防止外部对象修改内部值。
  即若使用copy指示符,则调用setter方法给变量赋值的时候,会将被赋值的对象复制一个副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用对象的计数减1
  不用copy的话,会创建一个新的空间,它的内容和原对象内容一模一样,然后属性是指向新空间的。当再有什么操作在对那个对象操作的话,只是在原空间上操作,对新空间没有影响。
示例如下:

@property (nonatomic, copy) NSString* title;

4.strong: 这是强引用指示符,强引用的意思是:该强引用指向的被赋值的对象不会自动回收,setter方法的实现是生成一个新对象,常用于对象类型,可以防止外部对象修改内部值。
用法示例:

@property (nonatomic, strong) NSArray* items;

5.weak: 与strong相反,该指示符为弱引用指示符,弱引用的意思是,即使该弱引用指向被赋值的对象,该对象也可能被回收。setter方法的实现是生成一个新对象,但不会增加其引用计数,可以防止循环引用。
代码示例:

@property (nonatomic, weak) id delegate;

6.readonly: 只生成getter方法,不生成setter方法。代码示例:

@property (nonatomic, readonly) NSString* identifier;

7.readwrite: 生成getter和setter方法,一般情况下,编译器默认为这个。例如:

@property (nonatomic, readwrite) NSString* name;

总结

  • 一般情况下,assign 用于基本数据类型,strong 用于对象类型,atomic 用于多线程环境。
  • 在单线程情况下,我们都会使用nonatomic指示符进行修饰,其用于不需要线程安全保证的情况,可以提高性能。
  • 不希望属性的值受到外部修改或者属性是不可变的类时,我们要使用copy
  • 在启用ARC机制时,如果不希望程序将被该属性引用的对象回收,那就应该用strong指示符;如果程序需要保证性能,避免内存溢出,则可以使用weak指示符。
  • 使用weak指示符时应该小心,当程序通过该weak属性来访问被引用的对象的时候,该对象可能已经被回收了。
  • 对于声明用weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil,这样能有效的防止悬空指针。weak指示符可有效的防止悬空指针
  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值