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

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件