深入的理解属性的修饰符(理论篇)

在ARC有效时,其类型上必须附加所有权修饰符,用来管理属性在内存中的生命周期。 所有权修饰符一共4种,

______strong ______weak ______unsafe_unreationed __autoreleasing

属性声明的属性

所有权修饰符

assign

__unsafe_unreationed 修饰符

copy

__strong 修饰符 (但是赋值得是被复制的对象)

reatin

__strong 修饰符

strong

__strong 修饰符

unsafe_unreatined

__unsafe_unreationed 修饰符

weak

__weak 修饰符

然后在声明成员变量时,如果同属性声明中的属性不一致就是引起编译错误。例如:

** 错误声明,同属性声明中的属性不一致 ** <pre> @property (nonatomic,weak) id obj;</pre>

** 正确声明 ** <pre>@property (nonatomic,weak) id __weak obj; //或者 @property (nonatomic,strong) id obj;</pre>

然后分别详细说明所有权修饰符的使用

__strong

__strong修饰符是 id类型 和 对象类型 的默认所有权修饰符。 <pre> id obj = [[NSObject alloc] init]; 等于 id __strong obj = [[NSObject alloc] init]; </pre>

__weak

因为带有______strong 修饰符的成员变量在持有对象时,很容易发生循环引用,循环引用很容易导致内存泄漏(既应当废弃的对象在超出其生存周期后继续存在)。所以苹果引入了 ______weak修饰符。 1.若附有______weak修饰符的变量所引用的对象被废弃,则将nil赋值给该变量。 2.使用附有____weak修饰符的变量,即是使用组成到autoreleasepool中的对象。 通过上面2特性,使用__weak修饰符可避免循环引用。并且检查附有__weak修饰符的变量是否为nil,可以判断被赋值的对象是否已废弃。

__unsfe_unretained 修饰符

______unsfe_unretained修饰符是不安全的所有权修饰符,并且附有__unsfe_unretained修饰符的变量不属于编译器的内存管理对象。 然后在iOS4 以及 OS X Sonw Leopard 的应用程序中,必须使用__unsfe_unretained修饰符来替代__weak修饰符。并且注意一点是,赋值给附有__unsfe_unretained修饰符变量的对象在通过该变量使用时,必须确保其确实存在,否则将会引起程序崩溃。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

SpringMVC之请求参数的获取方式

一般最常见的请求为GET和POST,get请求的参数在url上可以获取,post请求参数除了url上还有可能在表单中,文件上传时,获取方式又和一般的参数获取不一...

2855
来自专栏跟着阿笨一起玩NET

ASP.NET中Get和Post的用法

单form的提交有两种方式,一种是get的方法,一种是post 的方法.看下面代码,理解ASP.NET Get和Post两种提交的区别:

782
来自专栏LIN_ZONE

vue.js在laravel框架中的拦截器 ( axios)的使用--实现判断用户登录

在之前的项目中,使用vue的话,一个模块就使用一个blade.php文件,当然我的登录也会利用这个模板文件

602
来自专栏猿天地

spring-data-mongodb之MongoTemplate 添加数据

来源:猿天地 链接:http://cxytiandi.com/blog/detail/1733 今天我们来学习下MongoTemplate的添加数据操作,大神请...

3649
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常—— Properties文件的读写

在日常的Java程序开发中,Properties文件的读写是很常用的。经常有开发系统通过properties文件来当做配置文件,方便用户对系统参数进行调整。 ...

1757
来自专栏码农阿宇

ASP.NET WebAPI String 传值问题

如果我们再WebAPI中定义了只有一个string参数的WebAPI函数,如下所示: [HttpPost] public string TrackBill(st...

3416
来自专栏Jackson0714

项目中遇到的扩展方法-总结和分享

3187
来自专栏Java修行之道

使用application作用域实现:当用户重复登录时,挤掉原来的用户

1.application(ServletContext)是保存在服务器端的作用域,我们在application中保存两种形式的键值对:1:<userId, s...

1413
来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb09-Servlet(Java真正的全栈开发)

Servlet 一.Servlet 1. servlet介绍 Servlet 是在服务器上运行的小程序。Servlet 的主要功能在于交互式地浏览和修改数据,生...

3122
来自专栏小灰灰

SpringMVC之请求参数的获取方式

SpringMVC之请求参数的获取方式 常见的一个web服务,如何获取请求参数? 一般最常见的请求为GET和POST,get请求的参数在url上可以获取,po...

2069

扫码关注云+社区