http://blog.csdn.net/csz0102/article/details/25984275

注:以下讨论都是在ARC模式下

我们在iOS开发中最经常碰到的“引用(reference)”的使用是在error上,比如如下代码

  1. NSError *error = nil;
  2. BOOL success = [myContext save:&error];
  3. if (!success) {
  4. [NSApp presentError:error];
  5. return;
  6. }

这里的save方法实现大概是这样子

  1. - (BOOL)save:(NSError **)error
  2. {
  3. ...
  4. //假设出现了错误
  5. if (YES) {
  6. //An error occurred
  7. NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
  8. [errorDetail setValue:@"Failed to do something wicked" forKey:NSLocalizedDescriptionKey];
  9. *error = [NSError errorWithDomain:@"myDomain" code:100 userInfo:errorDetail];
  10. return NO;
  11. }
  12. return YES;
  13. }

下面来说一下需要注意的地方

1.可以注意到传递参数用的是&error,并且接收参数用的是(NSError **)。

其中&error指的是传这个变量的“引用”,即传变量的地址。(NSError **)其实是(NSError * __autoreleasing *)的缩写,指的是引用将会自动释放。

2.error是本地变量,如果error是一个实例变量(instance variable)的话会报错,具体报错信息为:“passing address of non-local object to __autoreleasing parameter for write-back”。

解决方法很简单,把(NSError **)修改为(NSError * __strong *)。

想要了解引用传递更细节的可以去看一下SO上的回答,分析的非常详细:Handling Pointer-to-Pointer Ownership Issues in ARC

Object-C中对“引用(reference)”的理解的更多相关文章

  1. Java中各种引用(Reference)解析

    目录 1,引用类型 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5, PhantomReference 6, ...

  2. 理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天学习 ...

  3. (转载)理解Java中的引用传递和值传递

      关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题,有论坛说Java中只有值传递,也有些地方说引用传递和值传递都存在,比较容易让人迷惑.关于值传递和引用传递其实需要分情况看待,今天 ...

  4. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  5. How do I duplicate a resource reference in code behind in WPF?如何在WPF后台代码中中复制引用的资源?

    原文 https://stackoverflow.com/questions/28240528/how-do-i-duplicate-a-resource-reference-in-code-behi ...

  6. Java Object对象中的wait,notify,notifyAll的理解

    wait,notify,notifyAll 是定义在Object类的实例方法,用于控制线程状态,在线程协作时,大家都会用到notify()或者notifyAll()方法,其中wait与notify是j ...

  7. 浅谈Java中的引用

    在Java语言中,引用是指,某一个数据,代表的是另外一块内存的的起始地址,那么我们就称这个数据为引用. 在JVM中,GC回收的大致准则,是认定如果不能从根节点,根据引用的不断传递,最终指向到一块内存区 ...

  8. c++中的引用与指针的区别

    http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...

  9. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

随机推荐

  1. Android Studio 连接 逍遥模拟器

    1.启动 逍遥模拟器: 2.打开 Android Studio 项目: 3.命令行 adb connect 127.0.0.1:21503 C:\Users\Administrator>adb ...

  2. SQL Serever学习10——T-SQL语句

    在sqlserver2018中使用的是Transact-SQL语言,简称T-SQL. 数据库的创建和管理 数据定义语言DDL DDL功能包括数据库,表,索引,视图,存储过程 数据库:CREATE DA ...

  3. SQL Serever学习9——基础查询语句

    SQL语言概述 SQL是结构化查询语言(Structure Query Language),1974年提出,1979年被IBM实现,SQL语言已经成为关系型数据库的标准语言. 包括: DDL数据定义语 ...

  4. 奇葩!把类型转成object

    事情是这样的,客户做代码审核,要求把参数类型转换成方法传入需要的类型.额,有点绕,简单来说就是 Create(UIElement e)这个方法要在调用的时候穿进去的参数转换成UIElement,哦对了 ...

  5. [linux] shell脚本编程-ubuntu创建vsftpd服务

    1.  useradd -s /bin/bash -m 用户名 ,  创建用户,自动创建家目录 , 设置登录shell 2.  echo 用户名:密码 | chpasswd ,非交互式设置密码 3.  ...

  6. [linux] C语言Linux系统编程进程基本概念

    1.如果说文件是unix系统最重要的抽象概念,那么进程仅次于文件.进程是执行中的目标代码:活动的.生存的.运行的程序. 除了目标代码进程还包含数据.资源.状态以及虚拟化的计算机. 2.进程体系: 每一 ...

  7. ckeditor添加自定义按钮整合swfupload实现批量上传图片

    ckeditor添加自定义按钮整合swfupload实现批量上传图片给ckeditor添加自定义按钮,由于ckeditor只能上传一张图片,如果要上传多张图片就要结合ckfinder,而ckfinde ...

  8. intellij idea Entity类报错“Cannot resolve table”

    https://blog.csdn.net/u014290233/article/details/54311954 转载,以便下次查看

  9. hdu 1880 魔咒词典 (字符串哈希)

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. RESTORE DATABASE命令还原SQLServer 2005 数据库

    --返回由备份集内包含的数据库和日志文件列表组成的结果集. --主要获得逻辑文件名 USE master RESTORE FILELISTONLY FROM DISK = 'g:\back.Bak' ...