函数参数传递 “指针的指针” (或是指针的引用)
来源:互联网 发布:生日相册制作软件 编辑:程序博客网 时间:2024/06/06 02:40
注:以下讨论都是在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
0 0
- 函数参数传递 “指针的指针” (或是指针的引用)
- 值传递-引用传递-指针传递-函数调用时指针参数的传递
- C++ 函数参数传递-传递指向指针的引用
- 用函数指针代替C++的引用参数 参数传递
- 用函数指针代替C++的引用参数 参数传递
- 函数参数的传递问题(指针的指针)
- 函数参数的传递问题(指针的指针)(转)
- 函数参数的传递问题(指针的指针)
- 函数参数的传递问题(指针的指针)(转)
- 函数参数的传递问题(指针的指针)
- 函数参数的传递问题(指针的指针)
- 函数参数的传递问题(指针的指针)(转)
- 函数参数的传递问题(指针的指针)(转)
- 函数参数的传递问题(指针的指针)
- 函数参数的传递问题(指针的指针)
- 函数参数的传递问题(指针的指针)
- 函数参数的传递问题(指针的指针)
- 函数参数(指针的指针)传递问题
- suricata学习--结构及代码解读
- JAVA 数据权限设计
- HTML5标签名小写
- 动态库的扩展名
- SMARTFORMS打印前9页显示*如何解决
- 函数参数传递 “指针的指针” (或是指针的引用)
- Readme-linux yaffs2(译)
- 连载:面向对象葵花宝典:思想、技巧与实践(36) - 设计原则如何用?
- JDK安装后 没有tools.jar 和dt.jar包的解决办法
- php数组函数大全
- win查看和关闭端口
- Android Touch和Click的区别
- memset函数使用详解
- org.springframework.web.multipart.MultipartException: The current request is not a multipart request