系列: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

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示