Object-C中对“引用(reference)”的理解
2024-10-21 13:28:09
http://blog.csdn.net/csz0102/article/details/25984275
注:以下讨论都是在ARC模式下
我们在iOS开发中最经常碰到的“引用(reference)”的使用是在error上,比如如下代码
- NSError *error = nil;
- BOOL success = [myContext save:&error];
- if (!success) {
- [NSApp presentError:error];
- return;
- }
这里的save方法实现大概是这样子
- - (BOOL)save:(NSError **)error
- {
- ...
- //假设出现了错误
- if (YES) {
- //An error occurred
- NSMutableDictionary *errorDetail = [NSMutableDictionary dictionary];
- [errorDetail setValue:@"Failed to do something wicked" forKey:NSLocalizedDescriptionKey];
- *error = [NSError errorWithDomain:@"myDomain" code:100 userInfo:errorDetail];
- return NO;
- }
- return YES;
- }
下面来说一下需要注意的地方
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
最新文章
- Php:学习笔记(一):版本选择
- 用word制作电子书最简捷模式 支持epub和mobi目录
- 在windows下面配置redis集群遇到的一些坑
- 记录在xx公司被考核的15天及自己的感想
- NYOJ题目839合并
- 再过几个月Apple Watch就要正式发布了
- maven中Rhino classes (js.jar) not found - Javascript disabled的处理
- Java for LeetCode 043 Multiply Strings
- 统计文件夹下java代码行数的小程序--主要是学习任务队列的思想
- [功能帮助类] C# BaseRandom随机数,随机字符,可限制范围-帮助类 (转载)
- Java 设计模式_复合模式(2016-08-31)
- Entityframework 伪CodeFirst开发模式应用于Sqlite数据库
- sql 里的 IF ELSE 语句用法
- Echarts数据可视化parallel平行坐标系,开发全解+完美注释
- SpringBoot轻松整合ElasticSearch
- 2、CentOS下编译安装Python2.7.6(转)
- weui textarea超出字符被截断
- WPF常用样式总结
- Linux运行Java出现“Exception in thread ";main"; java.lang.OutOfMemoryError: Java heap space”报错
- Xcode 常用命令