iOS--属性关键字

news2024/11/23 21:43:17

定义

chat:
在iOS开发中,属性关键字是用于声明类的属性(实例变量)的修饰符。属性关键字可以影响属性的访问权限、内存管理和生成相关的getter和setter方法。

属性关键字有哪些?

分类属性关键字
原子性atomic、nonatomic
修饰变量const、static、extern
读写权限readwrite、readonly、setter、getter
内存管理assign、weak、unsafe_unretained、retain、strong、copy
可空性(nullable、_Nullable 、__nullable)、(nonnull、_Nonnull、__nonnull)、(null_unspecified、_Null_unspecified 、__null_unspecified)、null_resettable

原子性

atomic

原子性(默认),编译器会自动生成互斥锁,对 setter 和 getter 方法进行加锁,可以保证属性的赋值和取值的原子性操作是线程安全的,但不包括操作和访问。比如说 atomic 修饰的是一个数组的话,那么我们对数组进行赋值和取值是可以保证线程安全的。但是如果我们对数组进行操作,比如说给数组添加对象或者移除对象,是不在 atomic 的负责范围之内的,所以给被 atomic 修饰的数组添加对象或者移除对象是没办法保证线程安全的。

nonatomic

非原子性,一般属性都用 nonatomic 进行修饰,因为 atomic 非常耗时。

读写权限

readwrite

可读可写(默认),同时生成 setter 方法和 getter 方法的声明和实现。

readonly

只读,只生成 getter 方法的声明和实现。

setter

可以指定生成的 setter 方法名,如 setter = setName。

getter

可以指定生成的 getter 方法名,如 getter = getName。

内存管理

assign

  1. 既可以修饰基本数据类型,也可以修饰对象类型;
  2. setter 方法的实现是直接赋值,一般用于基本数据类型 ;
  3. 修饰基本数据类型,如 NSInteger、BOOL、int、float 等;
  4. 修饰对象类型时,不增加其引用计数;
  5. 会产生悬垂指针(悬垂指针:assign 修饰的对象在被释放之后,指针仍然指向原对象地址,该指针变为悬垂指针。这时候如果继续通过该指针访问原对象的话,就可能导致程序崩溃)。

weak

  1. 只能修饰对象类型;
  2. ARC 下才能使用;
  3. 修饰弱引用,不增加对象引用计数,主要可以用于避免循环引用;
  4. weak 修饰的对象在被释放之后,会自动将指针置为 nil,不会产生悬垂指针。

unsafe_unretained

  1. 既可以修饰基本数据类型,也可以修饰对象类型;
  2. MRC 下经常使用,ARC 下基本不用;
  3. 同 weak,区别就在于 unsafe_unretained 会产生悬垂指针。

retain

  1. MRC 下使用,ARC 下基本使用 strong;
  2. 修饰强引用,将指针原来指向的旧对象释放掉,然后指向新对象,同时将新对象的引用计数加1;
  3. setter 方法的实现是 release 旧值,retain 新值,用于OC对象类型。

strong

  1. ARC 下才能使用;
  2. 原理同 retain;
  3. 但是在修饰 block 时,strong 相当于 copy,而 retain 相当于 assign。

copy

setter 方法的实现是 release 旧值,copy 新值,用于 NSString、block 等类型。

可空性

请添加图片描述
注意:nullability annotations 不能用于非指针类型,因为 Objective-C 中 nil 只能用在引用对象的指针上,而对于基础数据类型如 NSInteger 对于没有值的情况我们一般是使用 NSNotFound

所有权修饰符

所有权修饰符用法
__strong1. 强引用持有对象,可以对应 strong、retain、copy 关键字。2. 编译器将为 strong、retain、copy 修饰的属性生成带 __strong 所有权修饰符的实例变量.
__weak1. 弱引用持有对象,对应 weak 关键字,ARC下用来防止循环引用。2. 编译器将为 weak 修饰的属性生成带 __weak 所有权修饰符的实例变量。
__unsafe_unretained1. 弱引用持有对象,对应 unsafe_unretained、assign 关键字,MRC下用来防止循环引用。2. 编译器将为 unsafe_unretained 修饰的属性生成带 __unsafe_unretained 所有权修饰符的实例变量。3. 与 __weak 相比,它不需要遍历 weak 表来检查对象是否 nil,性能上要更好一些。但是它会产生悬垂指针
__autoreleasing在 MRC 中我们可以给对象发送 autorelease 消息来将它注册到 autoreleasepool 中,而在 ARC 中我们可以使用 __autoreleasing 修饰符修饰对象将对象注册到 autoreleasepool 中。

atomic 修饰的属性是怎么样保存线程安全的?

答: 编译器会自动生成互斥锁,对 setter getter 方法进行加锁,可以保证属性的赋值和取值原子性操作是线程安全的,但不包括操作和访问。比如说atomic修饰的是一个数组的话,那么我们对数组进行赋值和取值是可以保证线程安全的。但是如果我们对数组进行操作,比如说给数组添加对象或者移除对象,是不在atomic的负责范围之内的,所以给被atomic修饰的数组添加对象或者移除对象是没办法保证线程安全的。

什么时候使用 weak/__weak 关键字?

① ARC 中为了避免循环引用而使用,可以让相互引用的对象中的一个使用weak/__weak弱引用修饰,常用于对delegateblock的修饰;
② Interface Builder 中 IBOutlet 修饰的控件一般也是用weak

assign 和 weak 关键字的区别有哪些?

weak只能修饰对象,而assign既可以修饰对象也可以修饰基本数据类型;
assign修饰的对象在被释放后,指针仍然指向原对象地址;而weak修饰的对象在被释放之后会自动置指针为 nil;
相同点:在修饰对象的时候,assignweak都不改变对象的引用计数。

以下代码会出现什么问题?(深浅拷贝)

@property (copy) NSMutableArray *array;

不论赋值过来的是NSMutableArray还是NSArray对象,进行copy操作后都是NSArray对象(深拷贝)。由于属性被声明为NSMutableArray类型,就不可避免的会有调用方去调用它的添加对象、移除对象等一些方法,此时由于copy的结果是NSArray不可变对象,对NSArray对象调用添加对象、移除对象等方法,就会产生程序异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/779327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dpdpdp

这里写目录标题 139. 单词拆分322. 零钱兑换300. 最长递增子序列120. 三角形最小路径和64. 最小路径和63. 不同路径 II5. 最长回文子串(回文dp)⭐97. 交错字符串⭐(抽象成路径问题)221. 最大正方形⭐ 139. 单词拆分 class Soluti…

实用便捷!一站式BI系统推荐

在企业数字化转型过程中,BI系统可以建立业务、数据的双驱引擎,形成业务、数据的互补作用,通过建立数字化技术架构,明确企业的战略定位和业务目标,从而支撑实现这个目标。而一站式BI系统,则是指可以轻松从数…

使用Soft-RoCE实践RDMA

RDMA介绍 RDMA( Remote Direct Memory Access )意为远程直接地址访问,通过RDMA,本端节点可以“直接”访问远端节点的内存。所谓直接,指的是可以像访问本地内存一样,绕过传统以太网复杂的TCP/IP网络协议栈读…

Github 上有没有优秀的Java 项目推荐?

前言 下面是我精心整理的GitHub上关于Java的高Star的项目,可以自己选择去练手喔,希望对你有帮助~ 我们直接进入正题——> 1、 JavaGuide Star:135k JavaGuide指的是一份完整的Java学习指南或学习资料,它提供了Java编程语言…

AcWing4118. 狗和猫

输入样例1: 3 6 10 4 0 CCDCDD 4 1 2 0 CCCC 4 2 1 0 DCCD输出样例1: Case #1: YES Case #2: YES Case #3: NO样例1解释 在 Case 1 中,一共有 1010 份狗粮和 44 份猫粮。 前两只动物是猫,喂食它们后,还剩下 22 份猫粮…

数据结构之BinaryTree(二叉树)的实现

BinaryTree要实现的方法 总结 remove不在BinNode里,而是BinTree里 递归的两种写法 从上往下:同一对象的递归(参数多一个,判空用一句话),子对象的递归(参数void,判空用两句话&#…

算法分析和设计简答题

算法分析和设计简答题 1.1分治法的算法思想(重点) 1.2动态规划的算法思想(重点) 1.3贪心算法的算法思想 1.4回溯算法的算法思想 1.5分支限界法的算法思想 1.6时间复杂度的定义(最好/一般/坏),有什么意思 1.7渐进记号…

【Git】分支合并冲突产生与解决

文章学习自:麦兜搞IT,如有侵权,告知删除 文章目录 前言1 Fast Forword 合并1.1 核心原理1.2 举个栗子1.3 经验之谈 2 three way merge2.1 核心原理2.2 举个栗子(不带冲突)2.3 带冲突的three way merge 3 变基rebase3.…

Windows上配置Python环境变量

Python配置环境变量 🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! Python下载官网&#xff1…

GB28181设备接入端如何播放语音广播数据?

技术背景 语音广播功能是GB28181设备接入端非常重要的功能属性,语音广播让终端和平台之间,有了实时双向互动,可以满足执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、…

Docker介绍以及实战教程

Docker简介 Docker为什么出现 从事软件开发的朋友,可能经常会碰到以下场景:运维:你这程序有Bug啊,怎么跑不起来啊!开发:我机子上能跑啊,你会不会用啊究其原因还是开发环境与生产环境不同造成的…

基于linux下的高并发服务器开发(第二章)- 2.18 内存映射(2)

1.如果对mmap的返回值(ptr)做操作(ptr), munmap是否能够成功? void * ptr mmap(...);ptr; 可以对其进行操作munmap(ptr, len); // 错误,要保存地址 2.如果open时O_RDONLY, mmap时prot参数指定PROT_READ | PROT_WRITE会怎样? 错误,返回MAP_FAILEDopen()函数中的…

cpolar+calibre搭建自己的kindle书库

cpolarcalibre搭建自己的kindle书库 在我们身边众多的便携电子设备中,Kindle无疑是最为矛盾的设备之一,很多人在买它时都想读书破万卷,可是到最后Kindle的归宿都是盖泡面。尽管如此,当亚马逊不讲武德,打算将Kindle真正…

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解,搞脑子一片浆糊,反复推算,好不容易理清了思路,记录下来,防止忘记。开辟的RAM总容量为128bytes,数据的位宽为32位(即一个单元有32bit…

CodeForces:Madoka and Underground Competitions

经过观察&#xff0c;发现只要延小区域 右上-左下 的对角线填满X即可&#xff0c;那么就是可以总结为满足(i j) % k (r c) % k #include <bits/stdc.h> using namespace std; int t; void solve(){int n, k, r, c;cin >> n >> k >> r >> c…

团队如何选择合适的Git分支策略?

现代软件开发过程中要实现高效的团队协作&#xff0c;需要使用代码分支管理工具实现代码的共享、追溯、回滚及维护等功能。目前流行的代码管理工具&#xff0c;包括CVS&#xff0c;SVN&#xff0c;Git&#xff0c;Mercurial等。 相比CVS和SVN的集中管理&#xff0c;Git具有非常…

【stable diffusion】保姆级入门课程03-Stable diffusion(SD)图生图-涂鸦(绘图)的用法

目录 0.本章素材 1.涂鸦有什么用 2.涂鸦的使用场景是什么 3.操作面板 4.提示词与涂鸦 5.涂鸦与重绘幅度 6.涂鸦的其他用法(自由创作) 7.课后训练 0.本章素材 Realistic Vision V3.0模型(真实系模型)百度网盘链接&#xff1a;https://pan.baidu.com/s/1HkSKW2t4L6wMg…

openlayers系列:加载arcgis和geoserver在线离线切片

https://www.freesion.com/article/1751396517/ 1.背景 有个项目需要使用openlayer加载各种服务上发布的数据&#xff0c;坐标系也不同&#xff0c;我们都知道openalyer默认可以加载EPAG:3857,要加载4490的坐标系的数据需要重新定义一下&#xff0c;之后再加载。一想起要重新…

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询

[SQL系列] 从头开始学PostgreSQL 索引 修改 视图_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131818865 事务 事务是一系列逻辑相关的数据库操作&#xff0c;可以作为一个整体进行操作或者回滚。事务通常会包含一个序列的读或者写操作&#xf…