• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Object-C中对“引用(reference)”的理解--__autoreleasing

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

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

 

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

 


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

 

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

 

 

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

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人参与评论

请发表评论

全部评论

专题导读
上一篇:
(C/C++学习)12.获取系统时间制作时钟(system()略解)发布时间:2022-07-13
下一篇:
C#中的LINQ发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap