ARC下的所有权修饰符
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 errorNSError ** 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下的所有权修饰符的更多相关文章
- 2016 2 - 23 arc中的所有权修饰符(_strong修饰符与_weak修饰符)
一 _strong修饰符 1._strong修饰符是id类型和对象类型默认的所有权修饰符.如下: id obj = [[NSObject alloc] init];//在没用明确变量所有权修饰符时,会 ...
- C++多态下的访问修饰符
C++多态下的访问修饰符 先上代码: class Parent { public: virtual void showMsg() { cout << "Parent showMs ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
- 01 (OC)* @property 后面可以有哪些修饰符?
一:@property 后面可以有哪些修饰符? 1:线程安全的: atomic,nonatomic 2:访问权限的 readonly,readwrite 3:内存管理(ARC) assign, cop ...
- Koltin——最详细的可见性修饰符详解
在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...
- Java 访问权限修饰符以及protected修饰符的理解
2017-11-04 22:28:39 访问权限修饰符的权限 访问修饰符protected的权限理解 在Core Java中有这样一段话“在Object类中,clone方法被声明为protected, ...
- Kotlin——中级篇(三):可见性修饰符详解
在Kotlin中,不管是类,对象,接口,构造函数,函数,属性及其设置器都具有可见性修饰符.Kotlin中的可见性修饰符共四种.即public.protected.private.internal.在不 ...
- (转)JAVA中的权限修饰符
注:本博文是转载的,原文地址:http://blog.csdn.net/xk632172748/article/details/51755438 Java中修饰符总结: 访问控制修饰符 访问控制修饰符 ...
- ES6扩展——正则扩展(u、y修饰符)
//下面三行代码效果一样 //全局匹配开头为a的 const regexp1 = /^a/g; const regexp2 = new RegExp('a','g'); const regexp3 = ...
随机推荐
- Winform开发中常见界面的DevExpress处理操作
我们在开发Winform程序的时候,需要经常性的对界面的一些控件进行初始化,或者经常简单的封装,以方便我们在界面设计过程中反复使用.本文主要介绍在我的一些项目中经常性的界面处理操作和代码,以便为大家开 ...
- lua学习之table类型
关系表类型,这是一个很强大的类型.我们可以把这个类型看作是一个数组.只是 C语言的数组,只能用正整数来作索引: 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil.同样,在C语言中 ...
- 算法實例-C#-信箱排序-PigeonHoleSort
# 算法实例 # 排序算法Sort 信箱排序PigeonHoleSort https://en.wikipedia.org/wiki/Pigeonhole_sort 算法說明 1.信箱算法使用一個完整 ...
- PyMySQL Evaluation
PyMySQL Evaluation This page will capture issues related to Openstack moving to the PyMySQL driver f ...
- 专业PHP 7 IDE - Eclipse PDT 4.0 终于出世
2016年6月22日,第一款开源免费的完整支持PHP 7版本的IDE - PDT 4终于发布.原本我是期望Netbeans 8.2的,但PDT 4.0 发布,就等不及了. PDT团队很高兴的宣布PDT ...
- 【转】MyEclipse 2015优化技巧
MyEclipse 2015优化技巧 MyEclipse 2015优化速度方案仍然主要有这么几个方面:去除无需加载的模块.取消冗余的配置.去除不必要的检查.关闭更新. 第一步: 去除不需要加载的模块 ...
- 【局部特征】ASIFT
由于相机正面白摄物体时,相机的光轴方向可能发生变化,带来扭曲.而SIFT算法虽具有完全的尺度不变性,但不具有完全的仿射不变性,对拍摄角度发生大角度空间变化的图像特征提取有一定的局限性.ASift通过模 ...
- Space.js – HTML 驱动的页面 3D 滚动效果
为了让我们的信息能够有效地沟通,我们需要创建用户和我们的媒体之间的强有力的联系.今天我们就来探讨在网络上呈现故事的新方法,并为此创造了一个开源和免费使用的 JavaScript 库称为 space.j ...
- css对齐
2016-10-25 <css入门经典>第15章 1.text-align属性: 块属性内部的文本对齐方式.该属性只对块盒子有意义,内联盒子的内容没有对齐方式.(注意:只是盒子内部的内容对 ...
- URI、URL、URN介绍
注:1. 仅从http(Hypertext Transfer Portocol)角度阐述,不涉及语言层面的类库. 2. 以下内容均参考<Http权威指南>一书. 一.万维网构成 ...