ARC有效时,id类型必须加上所有权修饰符

  • 下面为三种等效的声明,为了便于和二级指针的情况联系起来,采用第一种。
 NSError * __weak error = nil;
NSError __weak *error = nil;
__weak NSError *error = @"hehe";

所有权修饰符

__strong

  • 默认修饰符,修饰的变量的默认值为nil。当需要释放强引用指向的对象时,需要将强引用置nil。
  • 持有强引用的变量在超出其作用域时被废弃,同时释放其引用的对象

__weak

  • 弱引用不增加对象的引用计数,不能持有对象实例

    • 下列程序会引起编译警告。更好的做法是将强引用赋给弱引用
id __weak = [[NSObject alloc] init];
  • 对象在被dealloc时,指向它的弱引用会自动被置nil(zeroing weak pointer),防止野指针产生
  • 弱引用一般用于处理retain cycle,如在delegate关系中防止循环引用或者用来修饰指向由Interface Builder编辑生成的UI控件

__unsafe_unretained

  • __unsafe_unretained修饰的变量不属于编译器的内存管理对象,可理解为MRC时代的assign
  • 不增加所引用对象的引用计数值,但是不保证指针指向的可访问性(类似于C++的普通指针,存在野指针情况)

__autoreleasing

  • ARC有效时,使用@autoreleasepool块代替NSAutorelesePool类,用附有__autoreleasing修饰的变量替代autorelease方法
  • 主要用在参数传递返回值(out-parameters)和引用传递参数(pass-by-reference)的情况下。
  • 此类对象在创建出来后,被注册到autoreleasing pool中
  • __autoreleasing修饰的变量要为自动变量(局部变量,函数以及方法参数)

二级指针与修饰符

  • 二级指针(id的指针或对象指针的指针)在没有显示指定时会被附加上__autoreleasing修饰符

    • NSError *error等价于NSError * __strong error
    • NSError ** error等价于NSError * __autoreleasing *error
    • 实际上,现在xcode中已经不允许不带修饰符的二级指针
  • 给二级指针的解引用赋值时,应保证两边的修饰符相同

    • 错误示例
      

    • 正确示例

   NSError* __autoreleasing error = nil;
NSError* __autoreleasing *p_error = &error;
  • 在调用形参为二级指针的方法时,如果用户传入实参的所有权修饰符不符,编译器会转换源代码

    • 原代码
- (void)getError:(NSError* __autoreleasing *)error {
error = nil;
}
- (void)callGetError {
NSError *error = nil;
[self getError:&error];
}
  • 转换后的callGetError
- (void)callGetError {
NSError *error = nil;
NSError* __autoreleasing tmp = error;
[self getError:&tmp];
error = tmp;
}

二级指针与__autoreleasing

  • 当函数形参arg为__autoreleasing修饰的二级指针时,在函数体内对*arg赋值,最终*arg引用的是已注册到autoreleasepool的对象
void getErr:(NSError * __autoreleasing *)error {
*error = [[NSError alloc] initWithDomain:aDomain code:NSURLErrorBadURL userInfo:nil];
}

ARC下的所有权修饰符的更多相关文章

  1. 2016 2 - 23 arc中的所有权修饰符(_strong修饰符与_weak修饰符)

    一 _strong修饰符 1._strong修饰符是id类型和对象类型默认的所有权修饰符.如下: id obj = [[NSObject alloc] init];//在没用明确变量所有权修饰符时,会 ...

  2. C++多态下的访问修饰符

    C++多态下的访问修饰符 先上代码: class Parent { public: virtual void showMsg() { cout << "Parent showMs ...

  3. Objective C中的ARC的修饰符的使用---- 学习笔记九

    #import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...

  4. 01 (OC)* @property 后面可以有哪些修饰符?

    一:@property 后面可以有哪些修饰符? 1:线程安全的: atomic,nonatomic 2:访问权限的 readonly,readwrite 3:内存管理(ARC) assign, cop ...

  5. Koltin——最详细的可见性修饰符详解

    在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...

  6. Java 访问权限修饰符以及protected修饰符的理解

    2017-11-04 22:28:39 访问权限修饰符的权限 访问修饰符protected的权限理解 在Core Java中有这样一段话“在Object类中,clone方法被声明为protected, ...

  7. Kotlin——中级篇(三):可见性修饰符详解

    在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...

  8. (转)JAVA中的权限修饰符

    注:本博文是转载的,原文地址:http://blog.csdn.net/xk632172748/article/details/51755438 Java中修饰符总结: 访问控制修饰符 访问控制修饰符 ...

  9. ES6扩展——正则扩展(u、y修饰符)

    //下面三行代码效果一样 //全局匹配开头为a的 const regexp1 = /^a/g; const regexp2 = new RegExp('a','g'); const regexp3 = ...

随机推荐

  1. WinForm 简单蒙版实现控件遮盖

    在Web上面要实现一个遮罩层或者说是蒙版吧,有了DIV那不算什么难事,只要给div定好位置和大小,把颜色的Alpha值设一下就有透明的效果.不过在Winform中实现起来就没那么简单了事.尝试过用一个 ...

  2. 水晶报表13.x(Crystal Reports for VS2010)的安装部署经验

    这两天搞安装包真心坎坷,一个问题接一个问题,先是为了实现自定义动作现啃vbs,后面又是安装过程老是报错: 各种搜索.各种尝试,总算搞掂,积累了些经验,分享一下. 首先CR for VS2010的所有东 ...

  3. SignalR入门之多平台SignalR服务端

    之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...

  4. RabbitMQ入门教程——工作队列

    什么是工作队列 工作队列是为了避免等待一些占用大量资源或时间操作的一种处理方式.我们把任务封装为消息发送到队列中,消费者在后台不停的取出任务并且执行.当运行了多个消费者工作进程时,队列中的任务将会在每 ...

  5. MEF入门之不求甚解,但力求简单能讲明白(四)

    上一篇我们已经可以获取各种FileHandler的实例和对应的元数据.本篇,我们做一个稍微完整的文件管理器. 1.修改接口IFileHandler,传入文件名 namespace IPart { pu ...

  6. hibernate----component-entity (人-地址-学校)

    package com.ij34.dao; import javax.persistence.*; @Entity @Table(name="school_inf") public ...

  7. luogg_java学习_01_JAVA基本概述

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 1.1基础常识 常用的dos命令 dir 列出当前目录 ...

  8. [教学] 将 Form 内的控件变成 Style 简易运用

    1. 在 Form 上放一个 TImage ,再一个 TText 到 Image 里面,并将 Image1.StyleName 设定为 BtnStyle,如下: 2.接着放一个 TButton,将 S ...

  9. Android版的菜谱客户端应用源码完整版

    Android版的菜谱客户端应用源码完整版,这个文章是从安卓教程网转载过来的,不是本人的原创,希望能够帮到大家的学习吧. <ignore_js_op> 152936qc7jdnv6vo0c ...

  10. Java--concurrent并发包下阻塞队列介绍

    JDK提供了7中阻塞队列,这里介绍其中3中,剩余的以此类推原理相同. 1.ArrayBlockingQueue package com.seeyon.queue; import java.util.c ...