【Mac】关于property的各个修饰符

关于property的各个修饰符(strong,weak,retain,assign,copy等等) 下面对property的修饰符作一次总结,上网查了不少资料,后面附上参考的资料链接,多谢他们的帮助。1、atomic 和 nonatomicatomic是默认的属性,表示对对象的操作属于原子操作,主要是在多线程的环境下,提供多线程访问的安全。我们知道在多线程的下对对象的访问都需要先上锁访问后再解锁,保证不会同时有几个操作针对同一个对象。如果编程中不涉及到多线程,不建议使用,因为使用atomic比no 阅读详情

引用:https://blog.youkuaiyun.com/shenzhonglaoxu/article/details/47807081

 

1、atomic 和 nonatomic

atomic是默认的属性,表示对对象的操作属于原子操作,主要是在多线程的环境下,提供多线程访问的安全。我们知道在多线程的下对对象的访问都需要先上锁访问后再解锁,保证不会同时有几个操作针对同一个对象。如果编程中不涉及到多线程,不建议使用,因为使用atomic比nonatomic更耗费系统资源。nonatomic 表示访问器的访问不是原子操作,不支持多线程访问安全,但是访问性能高。

2、readwrite 和readonly

readwrite 是默认的属性,表示可以对对象进行读和写,会生成对象相应的setter和getter方法。readonly 表示只允许读取对象的值,只会生成对象的getter方法。当给readonly类型赋值时,会直接报错。 
 

3、retain和assign

假设有一个属性property,分别用retain和assign修饰的时候,对于操作:

self.property = newValue;

对于retain,相当于完成了以下几步:

if(property != newValue)
{
    [property release];
    property = [newValue retain];
}

对于assign,则是:

property = newValue;

retain会先释放原来的对象,然后给新对象引用计数加1;而assign不增加引用计数,assign的作用是简单赋值,不改变引用计数,对基础数据类型(NSInteger,CGFloat)和C数据类型(int, float, double)等适用。

注:项目代码中,对象使用assign应该是误用;

4、strong 和 weak

当一个对象不再有strong类型引用指向它的时候,它就会被释放,即使该对象还有weak类型引用指向它,并且还指向该对象的weak引用会被置为nil,防止野指针的出现。

在别的地方看到一个形象的例子,忘了出处是哪里了,如果是您写的,请告诉我把出处加上~

将一个对象类比为一只狗,释放对象类比为狗要跑掉。strong类型就像是栓住狗的绳子,只要有绳子拴住狗,它就不会跑掉。如果有5条绳子栓一只狗,除非5条绳子都脱落,否则狗是不会跑掉的,就相当于只有每个strong指针都被置为nil时,对象才会被释放。weak类型就像是看着狗的小孩子,只要狗一直被拴着,那么小孩子就能看到狗,会一直指向它,只要狗的绳子脱落,那么狗就会跑掉,不管有多少的小孩在看着它。最后,狗跑掉以后,小孩也就和狗之间没什么联系了。只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

之所以要引入weak类型,最主要的防止strong类型之间形成循环,使大家都不能释放造成内存泄露。最明显的例子就是delegate,以一个viewcontroller和tableview为例,如果viewcontroller中有strong类型指向tableview,而tableview的delegate指向viewcontroller,如果delegate是strong类型,那么要销毁delegate就要销毁viewcontroller,而要viewcontroller则要先销毁delegate,这样就形成循环了。所以要将delegate声明为weak类型的,这样才能在viewcontroller需要销毁的时候进行销毁。

5、retain和strong,assign和weak的关系

retain和strong是一致的(声明为强引用);assign和weak是基本一致的(声明为弱引用),之所以说它俩是基本一致是因为它俩还是有所不同的,weak严格的说应当叫“归零弱引用”,即当对象被销毁后,会自动的把它的指针置为nil,这样可以防止野指针错误。而assign销毁对象后不会把该对象的指针置nil,对象已经被销毁,但指针还在痴痴的指向它,这就成了野指针,这是比较危险的。 retain和assign是ARC之前使用的,strong和weak这两个都是在ARC下才加入的,strong是默认的修饰符。

6、copy

那么多修饰符中,我觉得copy算是比较麻烦的一个了,看别人的代码,大部分的时候NSString的属性都是copy类型,那copy与strong到底有什么区别呢?

首先我们看看将一个属性声明为copy类型时,对于

self.property = newValue;

背后其实做了这么几件事:

if(property != newValue)
{
    [property release];//原本指向的对象技术减1
    property = [newValue copy];//指向新的对象,计数为1
}

声明两个属性

@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic, copy) NSString *cStr;

我们进行以下的操作

NSString *str1 = @"123";
NSMutableString *str2 = [NSMutableString stringWithString:@"abc"];
//case 1
self.strongStr = str1;
self.cStr = str1;
//case 2
self.strongStr = str2;
self.cStr = str2;
//case 3
[str2 appendString:@"asd"];

分别将三种情况下,各指针指向的值、指向的区域和本身存储的区域打印出来: 

对于case 1,str1是NSString,此时strongStr和cStr都指向str1指向的地方,这种情况下strong和copy类型并没有区别,两种都是是指针拷贝(浅拷贝),因为str1指向的区域内存是immutable的,所以不会产生什么问题。若str转而指向别的区域,对strongStr和cStr是没影响的。我的理解是对于一个immutable对象调用copy方法不会返回新的内存区域。

对于case 2,因为NSMutableString是NSString的子类,所以str2是可以赋值给strongStr和cStr的。strongStr和str2指向同一块区域,而cStr指向另一个内容相同的新区域。相当于strong类型是浅拷贝,copy是深拷贝。

对于case 3, 因为str2是mutable的,所以可以更改str2指向的区域内容,而strongStr与str2指向同一片区域,它的值也会随着一起更改,这在大多数情况下可能并不是我们想要的结果。而cStr因为是指向另一块新区域,所以并不会收到str2的影响,这可能才是我们想要的结果。

 

7、immutable和copy

我们来看一下这种情况:

 

@property (nonatomic, copy) NSMutableArray *array;

NSArray *array1 = [NSArray arrayWithObjects:@"234", @"323", nil];
NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"234", @"323", nil];
//case 1
self.array = array1;//将NSArray赋值给NSMutableArray,发出警告

//case 2
self.array = array2;
[self.array addObject:@"321"];//运行时报错

case 1好理解,对于case 2,前面说了,copy方法返回的是immutable对象,所以array其实是immutable的,尽管它是mutable类型,修改immutable对象时就会报错。所以对于mutable的属性,我们应该声明为strong类型。

8、关于copy和mutableCopy

NSArray *originArray = [NSArray arrayWithObjects: @"234", @"323", nil];
NSMutableArray *originMutableArray = [NSMutableArray arrayWithArray:originArray];
NSArray *originArrayCopy = [originArray copy];
NSMutableArray *originArrayMutableCopy = [originArray mutableCopy];
NSMutableArray *originMutableArrayCopy = [originMutableArray copy];
NSMutableArray *originMutableArrayMutableCopy = [originMutableArray mutableCopy];

// case 1:运行时错误,immutable对象不可修改
[originMutableArrayCopy addObject:@"321"];

 

各个变量指向的内存区域: 

这里再一次印证了前面的内容,对一个immutable对象调用copy方法并不会返回新的内存区域。同时copy返回的内存区域是不可改变的。

终于把各种类型的修饰符理清了,写的还不是太全面如果有什么理解偏差的地方,还请指正! 
(第一次用csdn的markdown编辑器写,还挺好用,就是没有自动保存草稿的功能)

 

参考资料

华为数通认证备考全攻略:HCIA/HCIP/HCIE进阶路线与核心考点解析 路由交换是网络工程师必须掌握的核心基础,也是华为数通认证体系的考核重心。面对HCIA、HCIP、HCIE三个等级,很多初学者只将其看作初级、中级、高级的线性递进,忽略了它们实际上对应着不同的岗位能力和工程经验要求。从笔试刷题到实验操作,从OSPF、BGP等高频协议到IPv6、SDN等新技术权重提升,备考者需要构建从理论认知到工程判断的完整能力链。华为认证作为网络行业中认可度极高的技术资格,不仅是求职入行的敲门砖,更映射着数据中心、企业园区等真实组网场景中对健壮性、可用性、可扩展性的综合要求。高效利用笔试题库 阅读详情

相关推荐

PHP反序列化漏洞实战:从CTF题看攻防原理与防御

序列化与反序列化是数据持久化和网络传输中的基础技术,其核心是将数据结构或对象状态转换为可存储或传输的格式,反之亦然。在PHP中,这一过程通过serialize()和unserialize()函数实现,但若反序列化的数据源用户可控,则可能触发对象中的特定“魔法方法”,从而形成安全漏洞。其技术价值在于理解此漏洞可深入把握PHP对象生命周期与自动化调用机制,对提升代码安全审计能力至关重要。典型应用场景包括缓存数据还原、会话存储及远程通信。本文以一道经典CTF题目为例,深入剖析PHP反序列化漏洞的成因、利用链构造及

weixin_34023982的博客 343

iOS:ARC相关知识,assign/copy/retain/strong/weak/readyonly/readwrite/nonatomic/atomic

dfsf ARC 自动引用计数 ARC不是垃圾回收,而是编译器自动插入代码来减少程序员的代码输入和失误。 同时比垃圾和效率要高,因为其不影响运行时间,相当于自己管理内存。 总是通过属性来管理实例变量(init/dealloc除外),在deal

混迹于移动互联网和手机行业 9270

Postman接口测试入门:从HTTP请求到自动化测试实战

接口测试是验证软件组件间通信协议正确性的关键环节,其核心在于模拟客户端向服务器发送请求并验证响应。HTTP协议作为Web通信的基石,定义了请求方法、状态码、报文头等规范,而RESTful API则是基于HTTP构建的流行架构风格。掌握接口测试技术能有效保障API的功能、可靠性与安全性,提升开发与测试效率,广泛应用于前后端联调、微服务验证和持续集成流程。Postman作为一款图形化工具,通过直观界面封装了复杂的HTTP细节,支持环境变量管理、集合组织和JavaScript测试脚本,显著降低了接口调试与自动化测

weixin_33701294的博客 369

copy 和 strong 的使用总结,@property和@synthesize详解

copy修饰符和strong修饰符的使用总结,延伸出对@property和@synthesize的详细说明,同时解释了self.语法和_语法使用时的注意事项

weixin_44544690的博客 424

基于Freescale BeeKit的ZigBee智能照明网络开发实战指南

在物联网和智能家居领域,无线通信技术是实现设备互联的基础。ZigBee作为一种基于IEEE 802.15.4标准的低功耗、自组网无线技术,其核心价值在于网状网络(Mesh Networking)和自组织能力,特别适合需要大量设备协同工作的场景,如智能照明、传感器网络。其技术原理通过协调器、路由器和终端设备三种角色构建健壮网络,即使单个节点失效,数据也能通过其他路径传输。在工程实践中,快速搭建和配置ZigBee网络是关键。Freescale BeeKit Wireless Connectivity Toolk

weixin_33738578的博客 306

Objective-C入门指南:从环境搭建到实战项目开发

面向对象编程是现代软件开发的核心范式之一,它通过封装、继承和多态等机制组织代码,提升可维护性和复用性。在iOS/macOS生态中,Objective-C作为基于C语言的面向对象语言,其独特的消息传递机制和动态运行时特性,为理解Cocoa Touch框架的底层原理提供了关键视角。掌握Objective-C不仅能帮助开发者深入理解iOS系统框架的设计哲学,还能有效维护和迭代大量存量项目代码,尤其是在处理内存管理、与C/C++库桥接以及调试经典崩溃场景时具有不可替代的价值。对于希望夯实iOS开发基础、进入中大型团

weixin_30580341的博客 318

深度解析copy与strong的区别

strong此特质标明该属性定义了一种拥有关系。为这种属性设定新值时,设置方法会先保留新值再释放旧值,然后再讲新值设置上去。 copy 此特质所表达的所属关系与strong类似。然而设置方法并不保留新值而是将其拷贝,当属性类型为NSString*时,经常用此特性来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例这个类是NSString的子类,表示一种可以...

rypen的博客 2929

XIAO ESP32C6物联网开发板入门指南:从Wi-Fi 6、BLE到低功耗应用

物联网(IoT)开发的核心在于实现设备与网络的稳定连接及高效数据交互,其基础原理涉及微控制器编程、无线通信协议和传感器数据采集。在技术层面,Wi-Fi 6提供了更高的网络吞吐量和抗干扰能力,蓝牙低功耗(BLE)则适用于短距离、低速率设备通信,二者结合能显著提升物联网系统的覆盖范围和能效。对于嵌入式开发,掌握低功耗设计(如深度睡眠模式)和传感器集成(如温湿度传感器)是构建实用物联网设备的关键。这些技术共同支撑了智能家居、环境监测等应用场景的实现。本文以XIAO ESP32C6开发板为例,详细介绍了如何利用其集

weixin_34068198的博客 569

property修饰符详解

1.关于@property property是编译器指令,由property

superyuan567的博客 562

CSS自定义滚动条:跨浏览器兼容的滚动体验优化指南

滚动条是网页基础交互组件,其样式直接影响用户对产品专业度与一致性的感知。CSS自定义滚动条通过伪元素(如::-webkit-scrollbar)和标准属性(scrollbar-width、scrollbar-color)实现视觉控制,核心原理在于浏览器内核差异:WebKit系依赖伪元素分层定制,Firefox则采用语义化声明。该技术具备轻量、零JS、高可维护等工程价值,广泛应用于SaaS后台、数据看板与品牌官网等对设计系统要求严苛的场景。本文聚焦真实项目中滚动条尺寸控制、圆角交互、渐进增强兼容、移动端降级及

weixin_34121304的博客 431

【16】linux命令/工具,systemd,文件操作,动静态库,信号,socket

apt install python3-pip --fix-missing(断开vpn,cp /etc/apt/sources.list /etc/apt/sources.list.bak,python3 -m pip install --upgrade pip,apt-get update,pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)设置时间,联网,apt-get install vim。

持续更新ing... 6788

iOS的property相关修饰符

iOS的property相关修饰符你如果参加过面试,80%的可能性会被问到过,@property的修饰符有哪些,区别又是什么;既然想深入的了解我们就要知道它的来龙去脉,首先,我们的得知道什么是property。PropertyOC中称为属性,采用此属性,编译器会自动帮我们合成一个变量以及setter、getter方法,比如:@property NSString * name;则系统会默认帮我们合成

zyx196的博客 1487

Mac键盘符号和修饰键说明

Mac键盘符号和修饰键说明,描述键盘符号意义,Mac键盘符号和修饰键说明,描述键盘符号意义

Mac Mouse Fix配置指南:从基础到高级自定义

你是否曾因Mac鼠标滚动方向与Windows习惯冲突而烦恼?是否想将鼠标侧键映射为手势操作却不得其门而入?本文将通过15个实用配置示例,帮助你全面掌握Mac Mouse Fix的核心功能,让普通鼠标发挥出Magic Mouse的操作体验。 ## 配置文件基础解析 Mac Mouse Fix使用`default_config.plist`作为配置文件骨架,采用Apple Property Lis...

gitblog_00375的博客 1350

微带天线理论学习笔记(1)

微带天线的概念是由Deschamps于1953年提出来的,它是在一块厚度远小于工作波长的介质基片的一面敷以金属辐射片、一面全部敷以金属薄层作接地板而成。辐射片可以根据不同的要求设计成各种形状。微带天线具有质量轻、体积小和易于制造等优点,广泛应用于个人无线通信中。

qq_36521926的博客 6227

医学图像处理实战:3D Slicer从安装到病灶分析全流程指南

本文提供了一份详尽的3D Slicer实战指南,涵盖从软件安装、DICOM数据导入到图像增强、病灶分割及三维可视化的全流程。重点演示了如何利用阈值分割、区域生长等核心图像处理技术进行病灶分析,并生成定量报告,是医学影像分析初学者的实用入门教程。

weixin_29278805的博客 601

readonly和retain区别

在官方的SDK中经常看到一些属性声明为@property(nonatmoic,readonly,retain)NSString* strName;等等, 例如在UITableViewCell的声明中就有如下代码 @property(nonatomic,readonly,retain) UILabel      *textLabel __OSX_AVAILABLE_STARTING(

zhangkongzhongyun的专栏 505

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2145

迅捷cad_迅捷属性

迅捷cadIn this tutorial, we’ll be discussing about Swift Properties. Properties are an important part of Classes, Structures and Enumerations in Swift. 在本教程中,我们将讨论Swift属性。 属性是Swift中Class , Structures和En...

从零开始的教程世界 280

Winget安装失败:深入解析InternetOpenUrl()错误0x80072efd的根源与修复

本文深入解析了使用Winget时遇到的InternetOpenUrl()错误0x80072efd。该错误通常源于DNS解析失败、网络代理配置不当或系统安全策略冲突,导致无法连接软件源。文章提供了从刷新DNS、修改Hosts文件到配置代理等一套完整的诊断与修复方案,帮助开发者快速解决安装障碍,恢复Winget的正常使用。

weixin_29290259的博客 932

PaddleOCR 3.x 最新版使用教程(2025)——从安装到实战身份证识别,一步到位!

本文针对PaddleOCR 3.x大版本更新带来的参数变化和兼容性问题,提供从环境配置到实际应用的全流程解决方案。

qq_58607032的博客 9787

Claude Code斜杠命令:AI编程的指令式协作新范式

在AI编程工具从对话式交互向工程化协作演进的背景下,斜杠命令作为一种轻量级、确定性、上下文感知的指令协议,正成为中高级开发者提升编码效率的核心范式。它摒弃模糊的自然语言prompt,转而通过`/clear`、`/rewind`等原子化命令实现精准上下文控制与可逆推理,显著降低重复操作损耗与重构风险。该模式契合现代IDE工作流,天然支持代码规范统一、测试契约生成与语义级重构,在全栈、后端及数据工程等注重交付效率的场景中展现出强技术价值。本文深入解析其设计原理与五大高频命令的实战逻辑。

weixin_33743880的博客 329

PyTorch深度学习项目实战100例数据集

最近很多订阅了的用户私信咨询有些数据集下载不了以及一些文章中没有给出数据集链接,为了解决这个问题,专门开设了本篇文章,提供数据集下载链接,打包100例的所有数据集。本专栏适用人群:深度学习初学者,专栏将具体讲解如何快速搭建深度学习模型用自己的数据集实现深度学习小项目。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 2万+

Unity项目文档自动化:基于DocFxForUnity的API文档生成与团队协作实践

在软件工程领域,API文档是连接代码实现与开发者理解的关键桥梁,其核心原理在于通过静态分析提取代码元数据,并结合结构化描述生成可访问的知识库。这一技术能显著提升代码的可维护性与团队协作效率,尤其适用于模块化、多人协作的中大型项目。通过自动化文档生成工具,开发者可以确保文档与代码同步更新,实现“单一事实来源”,从而减少沟通成本,促进知识沉淀。在Unity开发场景中,由于引擎特有的程序集结构和项目布局,通用的文档工具往往难以直接应用。DocFxForUnity正是为解决此问题而生,它基于微软DocFx引擎深度适

weixin_30947043的博客 335

【光伏风电功率预测】偏差考核每月少几十万:STL-VMD + Informer-LSTM 在某基地的落地案例

摘要:某风光一体化基地通过STL-VMD二次分解与Informer-LSTM并行残差模型,在不推翻现有预测系统的情况下,将风光功率预测的综合nRMSE降低了1.2-1.5个百分点。该方案通过分解预测误差为多个子序列,并采用不同模型处理各频段特征,显著改善了关键时段的预测精度。实施后,风电nRMSE从9.0%降至7.6%,光伏从10.2%降至8.8%,每月减少偏差考核费用30-50万元。项目经验表明,数据质量优化、参数调优及与业务目标对齐是关键成功因素,该技术路线具有可复制性,为风光基地预测精度提升提供了有效

专注AI大模型,软件混淆,授权 264

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 【Mac】Detecting File Dragging in Cocoa
下一篇: 【Mac】NSWindow 添加child window,如何居中
StreamH
博客等级 码龄21年 47粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值