之前面试了几家公司,都会问到这个基础的问题,以前,没有怎么注意,所以答的很混乱,所以查了查网上的资料,特意整理了一份。
 
常见修饰词有:assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite
 
其中部分用在特定的内存管理中:
ARC:assign、weak、strong、copy
MRC:assign、retain、copy、nonatomic、atomic
 
assign ( ARC/MRC )
1.这个修饰词是直接赋值的意思 , 整型/浮点型等数据类型都用这个词修饰 。
2.如果没有使用 weak、strong、 retain、 copy 等修饰 , 那么默认就是使用 assign 了 ( 它们之间是有你没我的关系 ,一般的指针变量是strong修饰)。
3.当然其实对象也可以用 assign 修饰 , 只是对象的计数器不会+1 . ( 与 strong 的区别 )
4.如果用来修饰对象属性 , 那么当对象被销毁后指针是不会指向 nil 的 . 所以会出现野指针错误 ( 与weak的区别 )。
 
weak ( ARC )(对象)
1.弱指针是针对对象的修饰词 , 就是说它不能修饰基本数据类型(int float) 。
2.weak 修饰的引用计数器不会+1 , 也就是直接赋值 。
3.弱引用是为打破循环引用而生的,比如在Block中,block在copy的时候,会对内部使用到的对象的引用技术+1,如果使用[self 方法名],那么就会有一个强指针指向self所在的对象的内存地址,对象的引用计数会+1,这样一来会导致对象所在的内存地址无法被释放,造成内存泄漏 。
4.它最被人所喜欢的原因是 它所指向的对象如果被销毁 , 它会指向 nil . 从而不会出现野指针错误 。
 
weak 和 assign的区别
assign与weak,它们都是弱引用声明类型,但是他们是有区别的。
1.用weak声明的变量在栈中就会自动清空,赋值为nil。
2.用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误!
以delegate的声明为例,在MRC中多delegate声明使用的是assign,这是为了不造成循环引用,这时,我们需要在-dealloc方法中写上 self.delegate = nil,以免造成delegate的野指针错误。当然,在ARC中,只需要用weak声明delgate,就会自动释放了。
 
strong ( ARC )(对象)
1.直接赋值并且对象的引用计数器 +1 。
2.在 ARC 里替代了 retain 的作用 。
 
retain ( MRC )
1.release 旧对象( 旧对象计数器 -1 ) , retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 。
 
2.在set方法里面是这样的 :
if (_dog != nil) {
    [_dog release];  
}  
_dog = [dog retain];
 
copy ( ARC/MRC )
1.copy 在 MRC 时是这样做的 release 旧对象( 旧对象的引用计数器 -1 ) , copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 .(新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)
  • 1.1在set方法里面是这样的 :
if (_dog != nil) {
     [_dog release]; 
_dog = [dog copy];
2.copy 在 ARC 时是这么干的 copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 。
  • 2.1在set方法里面是这样的 :
_dog = [dog copy];
3.使用注意 :
  • 3.1 修饰的属性本身要不可变的。例如 NSMutableArray 采用 copy 修饰 , 在addObject时会出现Crash, 因为NSMutableArray的对象在copy 过后就会变成NSArray。如果需要copy NSMutableArray对象,用:mutablecopy。
  • 3.2 对遵守 NSCopying 协议的对象使用 。
 
nonatomic ( ARC/MRC )
1.不对set方法加同步锁 。
2.性能好。
3.线程不安全。
 
atomic ( ARC/MRC )
1.原子属性就是对生成的 set 方法加互斥锁 (互斥锁 是一种同步锁,

互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。

自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。

自旋锁的效率高于互斥锁  )

@synchronized(锁对象) 。
@synchronized(self) { _delegate = delegate;}
2.需要消耗系统资源 。
3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 。
4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 。
 
nonatomic 和 atomic 的介绍和区别
1. 什么是atomicity(原子性)?
atomicity(原子性):我把原子性理解成线程对属性的单一执行。
例如,当两条线程同时执行一个属性的set方法的时候,如果不具有原子性(也就是声明属性时使用了nonatimic),那么就可能出现当A线程正在改写某属性值的时候,B线程也许会突然闯入,把尚未修改好的属性值读取出来。发生这种情况时,线程读取到的属性值肯定不对。
2. 保证atomicity真的就线程安全了吗?为什么日常声明都用的是nonatomic呢?
1.保证atomicity并非也是线程安全的,如果需要保证安全,需要跟深层次的线程锁定机制。
2.使用同步锁在iOS中开销比较大,会给程序带来性能上的问题。
3. 为什么atomicity也不能保证线程安全?
例如:当使用atomic时,仍然可能出现线程错误:当线程A进行set操作,这时其他线程的get或者set操作会因为等该操作而等待。当A线程的set操作结束后,B线程进行set操作,然后当A线程需要get操作时,却获得了在B线程的值,这就破坏了线程安全,如果有C线程在A线程get操作之前release了该属性,那么还会导致程序崩溃。所以仅仅使用atomic并不会使得线程安全,我们还是要为线程添加lock来确保线程的安全。
 
readonly (只读)
1.让 Xcode 只生成get方法 。
2.不想把暴露的属性被人随便替换时 , 可以使用 。
 
readwrite (读写)(默认)
1.让 Xcode 生成get/set方法 。
2.不用 readonly 修饰时 , 默认就是 readwrite 。

属性(@property)的修饰词有哪些,各自是什么作用,在哪种情况下用?的更多相关文章

  1. OC中属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?

    此次只做简单说明,不做代码演示! 1> readwrite:同时生成get方法和set方法的声明和实现 2> readonly:只生成get方法的声明和实现 3> assign:se ...

  2. Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)

    在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...

  3. ARC中__weak;__strong;__unsafe_unretained;修饰词

    测试代码: // Human.h代码 @interface Human : NSObject @property (nonatomic, weak) Cat *pinkCat; @property ( ...

  4. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  5. day26 python学习 对象的接口,封装,私用属性 property

    # 抽象类和接口类 #** #不崇尚接口类 #python本身支持多继承,没有接口专用的语法.但是我知道接口的概念 # 接口类:# 是规范子类的一个模板,只要接口类中定义的,就应该在子类中实现# 接口 ...

  6. ios 修饰词作用

    copy: NSString\NSMutableString\Block weak: 代理.UI控件(weak) strong: 其他OC对象 assign: 基本数据类型(int\float).枚举 ...

  7. 区分元素特性attribute和对象属性property

    × 目录 [1]定义 [2]共有 [3]例外[4]特殊[5]自定义[6]混淆[7]总结 前面的话 其实attribute和property两个单词,翻译出来都是属性,但是<javascript高 ...

  8. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

  9. 属性(@property)、@synthesize

    先前我们学的实例变量是这样的 { int _age; int _height; int age; } 后来学属性 @property int age; 看到@property 会自动编译生成某个成员变 ...

随机推荐

  1. 微信小程序日期定位弹出框遮挡问题

    只需要用bindtap绑定一个点击后的操作(隐藏键盘): wx.hideKeyboard()

  2. C 标准库 - <float.h>

    C 标准库 - <float.h> 简介 C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量.这些常量是由 ANSI C 提出的,这让程序更具有可移植性.在讲解这 ...

  3. C#应该掌握的一些东西

    C#应该掌握的一些东西   随着培训机构的增多,越来越多的人进入IT行业.那么对于我们这些自学出来,经验不够丰富的转行者来说,我们需要掌握最起码的一些东西,这对于面试很有用,而且在工作中也很常用.本人 ...

  4. Controller//控制器

    #include<opencv2\core\core.hpp> #include<opencv2\imgproc\imgproc.hpp> #include<opencv ...

  5. 抽象类的子类能够new

    纠结了半天,我以为继承了Activity后不能new这里被那个onCreate方法迷惑了以为会出现故障一直没直接创建对象类使用 后来试了试才知道 activity似乎是一个抽象类吧. 你要用他的方法, ...

  6. cvpr2017-code-etc

    cvpr2017: code:   http://staffhome.ecm.uwa.edu.au/~00053650/code.html

  7. Hadoop文档 索引

    Hadoop中文文档 http://hadoop.apache.org/docs/r1.0.4/cn/index.html Hadoop资料整理 http://www.itpub.net/thread ...

  8. Eclipse快捷键大全(转载)

    一·eclipse 中的一些常用的快捷键Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键.   1. [ALT+/] ...

  9. OpenCV 环境搭建( Win7 32位 / VS2010 / OpenCV2.4.8 )

    前言 本文介绍如何搭建 OpenCV 开发环境 配置如下: 操作系统:WIN7 32位 开发平台:VS2010 OpenCV 版本:2.4.8 第一步:安装 OpenCV 2.4.8 1. 登陆 Op ...

  10. csslint

    http://csslint.net/ line column title description browserwarning 1 1 Disallow @import @import preven ...