系列:iOS开发-strong 、weak、copy 、assign 、retain

2024-01-26 05:48

本文主要是介绍系列:iOS开发-strong 、weak、copy 、assign 、retain,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列:iOS开发-strong 、weak、copy 、assign 、retain

无论是在iOS开发刚学习的时候,还是在日常的开发中,我们都需要创建的对象,对应的我们就会有设置对象的类型的必要.
这个并不是说设置了就完事了,为什么我们要用strong 、weak、copy 、assign 、retain等这些不同的修饰词类定义对象呢?
说白了就是为了内存管理.
内存管理是我们做开发的所必须要时刻关注的问题.
好在iOS开发经过这么久的发展,已经经过了MRC的时代.现在的ARC时代系统自动管理内存,让我们省掉了很多事情,但是我们仍然的要关注,我们需要在适当的地方使用适当的类型,避免造成不必要的内存消耗,或者循环引用等问题.

copy: 用于希望保持一份传入值的拷贝,而不是值自身的情况,即把原来的对象完整的赋值到另外一地方,重新加载一内存区,一个地方变了不影响另一个地方的对象。
assign: 简单的直接赋值,相当于说两个对象指向同个内存区,一个地方的变了,其他的也跟着改变。
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数 为1
strong 用来修饰强引用的属性;类似于对应原来的retain或者copy
weak 用来修饰弱引用的属性;类似于对应原来的assign

copy与retain:
1、copy其实是建立了一个相同的对象,而retain不是;
2、copy是内容拷贝,retain是指针拷贝;
3、copy是内容的拷贝 ,对于像NSString,的确是这样,但是如果copy的是一个NSArray呢?这时只是copy了指向array中相对应元素的指针.这便是所谓的”浅复制”.
4、copy的情况:NSString *newPt = [pt copy];
此时会在堆上重新开辟一段内存存放@”abc” 比如0X1122 内容为@”abc 同时会在栈上为newPt分配空间 比如地址:0Xaacc 内容为0X1122 因此retainCount增加1供newPt来管理0X1122这段内存;

assign与retain:
1、assign: 简单赋值,不更改索引计数;
2、assign的情况:NSString *newPt = [pt assing];
此时newPt和pt完全相同 地址都是0Xaaaa 内容为0X1111 即newPt只是pt的别名,对任何一个操作就等于对另一个操作, 因此retainCount不需要增加;
3、assign就是直接赋值;
4、retain使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收;
5、retain的情况:NSString *newPt = [pt retain];
此时newPt的地址不再为0Xaaaa,可能为0Xaabb 但是内容依然为0X1111。 因此newPt 和 pt 都可以管理”abc”所在的内存,因此 retainCount需要增加1 ;

assign与weak:
1、assign修饰的是基本数据类型,weak修饰的是对象类型
2、weak比assign多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为nil,这样再向weak修饰的属性发送消息就不会导致野指针操作crash,而assign并不会赋值nil,也就是我们通常说的野指针
3、在MRC时代,我们使用代理的时候是使用的assign,ARC的时代我们更倾向于你使用weak,

strong与weak:
1、strong与weak是由ARC新引入的对象变量属性
ARC引入了新的对象的新生命周期限定,即零弱引用。如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自动设置为nil。
2、通常我们手动创建一个对象的时候我们会在vc中创建一个strong类型的对象,
表示当前的vc的类的对象拥有这个小的对象,这样其可以对该对象保持所有权,该对象的修改乃至销毁都由当前的vc来决定,当vc不存在的时候对象也会被释放
3、我们会在使用xib或者storyboard的时候,拖出来的是一个weak类型的对象,事实上IBOutlet的属性一般可以设为weak是因为它已经被view引用了,除非view被释放,否则IBOutlet的属性也不会被释放,另外IBOutlet属性的生命周期和view应该是一致的,所以IBOutlet属性一般设为weak。
4、在ARC的项目中,我们绝大部分看到的都是strong和weak修饰数据类型,我们更少的管理对象的内存释放问题.但是我们必须注意,比如一个NSTimer对象,通常我们使用strong,但是我们如果使用不当,我们就会造成其无法释放,从而导致vc无法释放的问题,这个你可以查找一些资料看看
5、在使用block的时候我们也会遇到循环引用导致的无法释放的问题
例如vc中有一个block,在block中直接调用vc中的一个对象.就会造成循环引用.
我们需要学会使用弱指针 __weak 来解决,后续的博客会单独介绍
6、strong强引用也就是我们通常所讲的引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。
7、weak弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。没办法,还是 “强哥” 有面子。

strong与retain:
1、声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong)
2、在声明Block时,使用strong和retain会有截然不同的效果。strong会等于copy,而retain竟然等于assign!
3、定义Block还是应该用copy因为非ARC下不copy的Block会在栈中,ARC中的Block都会在堆上的。

暂时只想到这么多,后续会继续添加

Demo地址:https://github.com/spicyShrimp/DEMO_OC

系列:iOS开发-前言+大纲
http://blog.csdn.net/spicyShrimp/article/details/62218521

这篇关于系列:iOS开发-strong 、weak、copy 、assign 、retain的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/645820

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类