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


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

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

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

    [objc] view plain copy
     在CODE上查看代码片派生到我的代码片
    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
     在CODE上查看代码片派生到我的代码片
    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

  • 相关阅读:
    access denied for user 'root'@'localhost'(using password:YES) FOR WINDOWS
    PKU 1001解题代码
    PKU 1002解题总结
    为什么vue组件data必须是函数
    call 和 apply 区别
    CSS|Stacking context 堆叠上下文
    Vue3.0 tsx 函数组件
    js中的变量提升
    JavaEE|架构
    MVC,MVP 和 MVVM
  • 原文地址:https://www.cnblogs.com/feng9exe/p/6498014.html
Copyright © 2020-2023  润新知