ARC当中变量的四种生命周期限定符

__strong

__weak

__unsafe_unretained

__autoreleaseing

  • __strong  是默认的限定符,无需显示引入,只要有强引用指向,对象就会长时间驻留在内存中。可以将__strong理解为reatain调用的ARC版本。
  • __weak  这表明引用不会保持被引用对象的存活。当没有强引用指向对象时,弱引用会被置为nil。可将__weak看作是assign操作符的ARC版本,只是对象被回收时,__weak具有安全性--指针将会被自动设置为nil。但是assign一般用来修饰基本数据类型,基本数据类型存储在由操作系统管理栈中,所以不用担心他什么时候置nil。
  • __unsafe_unretained  与weak类似,只是当没有强引用指向对象时,__unsafe_unretained不会被置为nil。可以将它看作assin的ARC版本。
  • __autoreleaseing 用于有引用使用 id *传递的消息参数。它预期了autorelease方法会在传递参数的方法中被调用。

  

  

Person * __strong p1 = [[Person alloc] init]; //创建对象之后引用计数器 为1,并且对象在p1被引用期不会被释放。
Person * __weak p2 = [[Person alloc] init]; //创建对象之后引用计数器 为0,对象会被立即释放,且p2将被设置为nil
Person * __unsafe_unretained p3 = [[Person alloc] init];//创建对象之后引用计数器 为0,对象会被立即释放,且p2不会被设置为nil

Person * __autoreleasing p4 = [[Person alloc] init]; //创建对象之后引用计数器 为1,当方法返回时对象会被立即释放

属性限定符

strong

  默认,指定了__strong关系, 能保证 对象在其作用于内不会被销毁。

weak

  指定了__weak关系,如果在一个{}作用于定义了一个__weak修饰的对象,由于引用计数器没有+1,创建好就是0,所以创建好了里么就会被销毁置nil。

assign

  ARC当中表示 __unsafe_unreataied关系

copy

  暗指了 __strong关系,它还暗指了 setter中的复制语义。

retain

  指定了__strong关系。ARC中基本不用。

unsafe_unretained

  指定了__unsafe_unretained关系。

注意:

  assign 和 unsage_unretained 只进行值复制而没有任何实质性的检查,所以他们应该用于值类型(BOOL, NSInter, NSUInteger),应该避免将他们用于引用类型,尤其是指针类型,如NSString *, UIView *。

unsage_unretained修饰的对象创建之后会被立即释放,但是内存可能还没有被回收,这个引用可以使用,且不会导致错误。但是再次调用创建这个unsage_unretained修饰的对象的函数时就会出现SIGABRT崩溃。原因,第二次创建调用函数时,对象已经析构,而且内存也被重新分配和使用了,于是导致了非法访问。

OC变量限定符和属性限定符的更多相关文章

  1. Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)

    Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...

  2. Object.defineProperty 与 属性描述符

    为JavaScript对象新增或者修改属性,有两种不同方式:直接使用=赋值或者使用Object.defineProperty 定义,使用后者的话还可以设置属性的描述符. Object.definePr ...

  3. SpringBoot环境属性占位符解析和类型转换

    前提 前面写过一篇关于Environment属性加载的源码分析和扩展,里面提到属性的占位符解析和类型转换是相对复杂的,这篇文章就是要分析和解读这两个复杂的问题.关于这两个问题,选用一个比较复杂的参数处 ...

  4. Python属性描述符

    实现了__get__.set.__delete__中任意一个方法的类,称之为属性描述符. 属性描述符可以控制属性操作时的一些行为. 只要具有__get__方法的类就是描述符类. 如果一个类中具有__g ...

  5. 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例

    [源码下载] 背水一战 Windows 10 (9) - 资源: 资源限定符概述, 资源限定符示例 作者:webabcd 介绍背水一战 Windows 10 之 资源 资源限定符概述 资源限定符示例 ...

  6. C++变量内存分配及类型修饰符

    前言 了解C++程序内存分配,有助于深刻理解变量的初始化值以及其生存周期.另外,变量类型修饰符也会影响到变量的初始化值及其生存周期.掌握了不同类型变量的初始化值及其生存周期,能够让我们设计程序时定义变 ...

  7. iOS 属性修饰符记录 --不定时更新

    重新审视了一下OC在属性修饰符,特意记录一下来.以后不定时更新 > retain:只有在非ARC下才会有效,所有如果在ARC下使用了retain修饰也白搭 如以下的data属性用retain修饰 ...

  8. 深入理解javascript对象系列第三篇——神秘的属性描述符

    × 目录 [1]类型 [2]方法 [3]详述[4]状态 前面的话 对于操作系统中的文件,我们可以驾轻就熟将其设置为只读.隐藏.系统文件或普通文件.于对象来说,属性描述符提供类似的功能,用来描述对象的值 ...

  9. OC 实例变量(instance var)与属性(@property)的关系 isa指针

    实例变量(instance var)与属性(@property)的关系 Objective-C 2.0之后,声明一个@property name自动产生一个实例变量,名为_name,因此省去实例变量和 ...

随机推荐

  1. 怎么去掉Xcodeproject中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32

    问题描写叙述  在我们的项目中,通常使用了大量的第三方代码,这些代码可能非常复杂,我们不敢修改他们,但是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许很多多的警告,那么 ...

  2. Android 四大组件 Service 服务

    1.Service简单介绍 依照使用范围分类: 类别 优点 缺点 差别 应用 本地服务 Local  Service 本地服务在一定程度上节约了资源,另外本地服务由于是在同一进程,因此不须要IPC,也 ...

  3. 在Vue项目中使用vw实现移动端适配

    有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着viewport单位越来越 ...

  4. ES6入门基础

    let和const 一.块级作用域 ES5 只有全局作用域和函数作用域,没有块级作用域,这样的缺点是:1.用来计数的循环变量泄露为全局变量.2.内层变量可能会覆盖外层变量 var tmp = new ...

  5. 物联网架构成长之路(10)-Nginx负载均衡

    0. 前言 关于Nginx负载均衡的简单配置,我以前博客配置过基于HTTP的负载均衡.这次的负载均衡有点不一样,就是基于TCP的负载均衡.基于HTTP负载均衡是默认的Nginx版本支持的,配置也很简单 ...

  6. 视频压缩和H264

    一.视频压缩 1.1 为什么需要压缩视频? 假设一个2小时未压缩的高清视频,1920×1080p的电影,我们来计算一下他的存储容量.先介绍一下帧率(frame rate或者是 FPS)概念,也就是每秒 ...

  7. 【iCore1S 双核心板_ARM】例程二:读取ARM按键状态

    实验原理: 按键的一端与STM32的GPIO(PB9)相连,且PB9外接一个1k大小的限流上接电阻. 初始化时把PB9设置成输入模式,当按键弹起时,PB9由于上拉电阻的作用呈高电平(3.3V): 当按 ...

  8. 【emWin】例程二十六:窗口对象——Listbox

    简介: 列表框用于选择列表的一个元素.创建的列表框可以没有环绕的框架窗口,或者作为 FRAMEWIN 小工具的子窗口建立列表框中的项目被选定后,会突出显示. 触摸校准(上电可选择是否进入校准界面) 示 ...

  9. 水塘抽样(Reservoir Sampling)问题

    水塘抽样是一系列的随机算法,其目的在于从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数量,尤其适用于不能把所有n个项目都存放到主内存的情况. 在高德纳的计算机程序设计艺术中,有如下问题: ...

  10. PaaS 应用引擎

    这里主要是梳理一下应用引擎(XXXX App Engine),它一般被归类到PaaS领域.应用引擎即提供了各种编程语言开发的应用所需的一整套运行环境:它开箱即用,你只需部署应用的代码即可,无需前期的环 ...