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. [转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

    本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...

  2. android开发的童鞋们 你该学点C++

    更多关于C++的知识点,请关注android开发应该学点C++(索引贴)android开发应该学点C++(其他) (*android开发论坛----android开发学习----android开发*) ...

  3. python(60):configparser 函数,配置文件

    ConfigParser模块学习 介绍 ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每 ...

  4. c++命名空间---namespace

    C++ 命名空间 C++ 应用程序中.例如,您可能会写一个名为 func() 的函数,在另一个可用的库中也存在一个相同的函数 func().这样,编译器就无法判断您所使用的是哪一个 func() 函数 ...

  5. Django 源码小剖: Django 中的 WSGI

    Django 其内部已经自带了一个方便本地测试的小服务器, 所以在刚开始学习 Django 的时候并不需搭建 apache 或者 nginx 服务器. Django 自带的服务器基于 python w ...

  6. [微信开发] 微信JSAPI - 获取用户地理位置信息

    参考博客 http://blog.csdn.net/u013142781/article/details/50503299 主要JS 方法 wx.getLocation 获取地理位置信息传递参数 成功 ...

  7. Tip 18 – How to decide on a lifetime for your ObjectContext

    Alex D James 7 May 2009 3:44 PM One of the most common questions we get is how long should an Object ...

  8. mariadb 10.1.26 二进制包安装笔记

    报错链接:http://php.upupw.net/ank2discuss/40/6841-e.html mariadb 10.1.26 二进制版本 全名称: mariadb-10.1.26-linu ...

  9. Go 实现异常处理机制

    实例: package main import "fmt" type DevideError struct { devidee int devider int } func (de ...

  10. 树莓GPIO &&python

      from http://www.cnblogs.com/xiaobo-Linux/p/8969324.html 命令行控制LED灯  echo 12 > /sys/class/gpio/ex ...