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

时间:2023-03-10 06:23:07
Object-C中对“引用(reference)”的理解

http://blog.****.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

相关文章