iOS ------ 关键字

关键字可以分为以下六类

  • 修饰器类型:@property、@synthesize、@dynamic
  • 原子安全类型: nonatomic、atomic
  • 计数引用类型: strong、weak、assign、copy、retain、unsafe_unretained
  • 读写类型:readonly,readwrite
  • 访问类型:extern、static、const
  • 局部引用类型:__weak、__block、__strong

1、修饰器类型:@property、@synthesize、@dynamic

1.1@property

@property (nonatomic,copy) NSString *str;

用来声明属性,相当于声明了_str,并且默认实现了str的getter和setter方法

1.2synthesize

#import "ClassA.h"@interface ClassA()@property NSString * str3;@end@implementation ClassA
// 或者写成 @synthesize str3
@synthesize str3 = str4;@end

@synthesize要用的话,必须得声明了同名的属性,例如我已经声明了str3,再用@synthesize声明str3,那么就相当于编译器默认生成了一个str3属性和一个str3成员变量.str3的getter个setter实际上操作的都是str4

1.3@dynamic

@dynamic声明属性就相当于告诉编译器不用生成属性的getter和setter方法,该属性的getter和setter方法由我自己生成

2、原子安全类型: nonatomic、atomic

这两个类型就是跟线程相关的,atomic与nonatomicd的主要区别就是系统自动生成的getter/setter方法不一样。

2.1、nonatomic

nonatomic(默认情况)表示非原子属性,也就是线程不安全类型,系统自动生成的getter/setter方法不会进行加锁操作。其内部的具体实现如下:

@property (nonatomic,strong) UIImage *image0;
@synthesize image0 = _image0;
/// MRC模式下- (UIImage *)image0{return _image0;
}- (void)setImage0:(UIImage *)image0 {if (_image0 != image0) {[_image0 release];_image0 = [[image0 retain] autorelease];}
}

2.2、atomic

atomic表示原子属性,表示线程安全,系统自动生成的getter/setter方法会进行加锁操作。其内部的具体实现如下:

@property (atomic,strong) UIImage *image1;
@synthesize image1 = _image1;
/// MRC模式下- (UIImage *)image1 {@synchronized (self) {return _image1;}
}- (void)setImage1:(UIImage *)image1 {@synchronized (self) {if (_image1 != image1) {[_image1 release];_image1 = [[image1 retain]autorelease];}}
}

atomic修饰的属性也不一定安全,当修饰NSMutableArray时,当我们进行removeadd的时候,此时也不是线程安全的,它不是原子操作。它保证的是gettersetter的线程安全。

3、计数引用类型: strong、weak、assign、copy、retain、unsafe_unretained

3.1 strong

当使用strong关键字修饰一个属性时,该属性不仅指向该对象,而且拥有该对象。该对象的引用计数会加1,属于强引用用。在ARC环境下,相当于retain。也称为浅拷贝(指针拷贝)。内存地址不变,只是生成了一个新的指针,新指针和引用对象的指针指向同一个地址。

注意:因为使用的是同一个内存地址,当该内存地址存储的内容发生变更的时候。属性也会变更。

3.2weak

同样经常用于修饰OC对象类型的数据,修饰的对象在释放后,指针地址会自动被置为nil,这是一种弱引用。

注意:在ARC环境下,为了避免循环引用,会把delegate属性用weak修饰,在MRC环境下使用assign修饰。当一个strong类型的指针不在指向它的时候,它就会被释放,即使还有weak的指针指向他,这些weak指针也会被值为nil。

weak属性修饰的变量,如何实现在变量没有强引用后自动置为 nil ?

runtime 维护了一个weak_table_t 弱引用表
,用于存储指向某一个对象的所有weak指针。weak表其实是一个哈希表,key是所指对象的地址,value是weak指针的地址的数组。在对象回收的时候,根据对象的地址将所有weak指针地址的数组,遍历数组把其中的数据置为nil。

3.3 assign

一般用来修饰非指针变量,用于基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等),另外还有id类型。也可用来修饰对象,但被assign修饰的额对象被释放后后,指针还是指针对象之前的地址,就变成了野指针。(如果用了assign修饰的对象,需要在dealloc函数中将该对象指针手动值为nil,可以消除野指针。

3.4 copy

copy和strong相同点在于都是属于强引用,都会是属性的计数加一,但是copy和strong不同点在于,它所修饰的属性当引用一个属性值时,是内存拷贝(深拷贝),就是在引用是,会生成一个新的内存地址和指针地址来,和引用对象完全没有相同点,因此它不会因为引用属性的变更而改变(当引用的属性值是不可变对象时,是浅拷贝)

具体的用例可以参考:strong和copy的区别

copy修饰的关键字不同在于属性setter的有一个关键语句:

_copyyStr = [copyyStr copy];

所以只有在用点语法赋值时copy关键字才会生效

@property (copy) NSMutableString* name;

如果用copy来修饰NSMutableArrayNSMutableDictionaryNSMutableString这种不可变对象会导致问题,初始化后通过copy生成的是该类型对应的不可变对象,例如NSArrayNSDictionaryNSString。如果我们按照可变对象进行修改属性操作,就有可能报错。

3.5 retain

retain主要用在MRC模式下,作用和strong几乎等同

3.6 unsafe_unretained

unsafe_unretained类型指针指向一块内存时,内存的引用计数也不会增加,这一点与weak一致。但是与weak类型不同的是,当其所指向的内存被销毁时,unsafe_unretained类型的指针并不会被赋值为nil,也就是变成了一个野指针。对野指针指向的内存进行读写,程序就会crash

4,读写类型 readonly readwrite

4.1 readonly

readonly相当于是系统只会默认生成该属性的getter方法,只可读不可写,用点属性的形式去赋值,那么就会编译报错。

如果是在该类的外部访问readonly属性,利用kvc直接赋值。可以通过在类的内部重写accessInstanceVariablesDirectly,固定返回No,那么外界就无法再通过kvc形式来更改

4.2 readwrite

readwrite就是声明该属性可读可写,一般默认就是readwrite,可以不用额外声明

5, 访问类型

5.1 extern

对于跨文件访问全局变量需要借助extern关键字声明,通过extern有两种方式可以访问其他文件的全局变量。

方式一
我们想要在B类访问A类中声明和定义的全局变量时,不导入A类的头文件,在B类中使用extern声明A类中的全局变量

方式二
我们在A.m文件中声明和定义的全局变量时,同时在A.h文件中做extern声明,在B类访问A类中全局变量时导入A的头文件就可以了,这种方式在代码中比较常见。

5.2 static

static除了可以修饰全局变量,还可以修饰局部变量,被static修饰的变量叫做静态变量。

主要作用:

  • 隐藏
    当程序有多个文件时,将全局变量或函数的作用域的作用范围限制在当前文件,对其他文件隐藏
  • 保持变量内容的持久化
    将函数的局部变量储存在全局数据区,使它不会随着函数的调用结束而被销毁

5.3 const

const用于修饰指针变量和基本数据类型,const放在谁前面,谁就是常量不可在更改。

不管是extern声明的全局变量还是用staticconst修饰的全局变量和局部变量,它们的生命周期都是从定义到程序结束。

6,局部引用类型:__weak,__strong,__unsafe_unretained,__autoreleasing

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

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

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

相关文章

Spring Boot集成Spire.doc实现对word的操作

1.什么是spire.doc? Spire.Doc for Java 是一款专业的 Java Word 组件,开发人员使用它可以轻松地将 Word 文档创建、读取、编辑、转换和打印等功能集成到自己的 Java 应用程序中。作为一款完全独立的组件,Spire.Doc for Java 的运行环境无需安装 Micro…

【stm32项目】基于stm32智能宠物喂养(完整工程资料源码)

基于STM32宠物喂养系统 前言: 随着人们生活幸福指数的提高,越来越多的家庭选择养宠物来为生活增添乐趣。然而,由于工作等原因,许多主人无法及时为宠物提供充足的食物与水。为了解决这一问题,我设计了一款便捷的宠物喂…

数据集,批量更新分类数值OR批量删除分类行数据

数据集批量更新分类OR删除分类行数据 import osdef remove_class_from_file(file_path, class_to_remove):"""从YOLO格式的标注文件中删除指定类别的行记录,并去除空行。:param file_path: YOLO标注文件路径:param class_to_remove: 需要删除的类别…

linux中的目录操作函数

参考 【Linux系统编程】Linux 文件系统探究:深入理解 struct dirent、DIR 和 struct stat结构 stat函数 C标准库提供了访问linux的目录的函数接口现对目录的操作。 一、libc接口 libc访问目录的流程为:打开目录,访问目录,关闭目…

uniapp 小程序 支付逻辑处理

uniapp 小程序 支付逻辑处理 上代码如果你不需要支付宝适配&#xff0c;可以删除掉支付宝的条件判断代码 <button class"subBtn" :disabled"submiting" click"goPay">去支付</button>// 以下代码你需要改的地方// 1. order/app/v1…

怎样实现大语言模型微调,庞氏骗局智能合约检查,BERT

目录 怎样实现大语言模型微调 一、了解微调的基本概念 二、选择合适的微调方法 三、实施微调的具体步骤 四、注意事项 庞氏骗局智能合约检查 一、使用的大模型 二、微调方法 1. 数据准备 2. 微调策略 3. 微调过程 三、输入和输出 输入 输出 四、注意事项 一、使…

【Linux】centos7安装php7.4

环境说明 本文档在服务器不能连接互联网的情况下&#xff0c;进行安装php7.4及其扩展。 操作系统&#xff1a;centos7.6 架构&#xff1a;X86_64 一、安装依赖&#xff08;可选&#xff09; 说明&#xff1a;服务器能联网就可以通过 yum install 命令下载对应php需要的依赖…

设计模式之策略模式_入门

前言 最近接触了优惠券相关的业务&#xff0c;如果是以前&#xff0c;我第一时间想到的就是if_else开始套&#xff0c;这样的话耦合度太高了&#xff0c;如果后期添加或者删除优惠券&#xff0c;必须直接修改业务代码&#xff0c;不符合开闭原则&#xff0c;这时候就可以选择我…

【TypeScript 一点点教程】

文章目录 一、开发环境搭建二、基本类型2.1 类型声明2.2 基本类型 三、编译3.1 tsc命令3.2 tsconfig.json3.2.1 基本配置项includeexcludeextendsfiles 3.2.2 compilerOptions编译器的配置项 四、面向对象4.1 类4.2 继承4.3 抽象类4.4 接口 一、开发环境搭建 下载Node.js《Nod…

usb pd message结构解析

usb pd 3.1规范定义了三种类型的消息: •简短的控制消息&#xff0c;用于管理端口伙伴之间的消息流或交换不需要额外数据的消息。控制消息的长度为16位。 •用于在一对端口伙伴之间交换信息的数据消息。数据报文的长度范围是48 ~ 240位。 有三种类型的数据消息: ▪那些用于暴露…

【区块链+绿色低碳】双碳数字化管控平台 | FISCO BCOS应用案例

地方政府、园区及企业实现“双碳”目标过程中存在一些挑战与难点&#xff1a; 1. 管理者难以掌握完整、准确、全面的碳排放数据进行科学决策&#xff1a;由于碳排放核算需要对数据的来源、核算方法 的规范性和采集方法的科学性有严格要求&#xff0c;当前面临碳排放数据数据采…

中国一汽发布“一汽●北斗云工作台” 意在推动企业数智化转型

“一汽●北斗云工作台”已经实现100%自主可控&#xff0c;覆盖企业全价值链、全体系、全过程、全岗位的工作需求。目前一汽2.3万个业务单元实现线上作业&#xff0c;产品开发效率提升30%&#xff0c;订单交付周期缩短25%以上。”7月17日&#xff0c;中国第一汽车集团有限公司&a…

智能路面裂缝检测:基于YOLO和深度学习的全流程实现

引言 路面裂缝检测是维护道路质量和延长道路寿命的重要手段。传统的检测方法往往费时费力且易受人为因素影响。为了提高检测效率和准确性&#xff0c;本文介绍了一种基于深度学习的路面裂缝检测系统。该系统包括用户界面&#xff0c;利用YOLO&#xff08;You Only Look Once&a…

Typescript学习笔记(1.0)

1.ts开发环境&#xff1a;先安装Node&#xff0c;然后执行命令npm i -g typescript,这里使用的是npm命令&#xff0c;也可以使用pnpm和yarn安装&#xff0c;不过需要额外安装pnpm 和yarn。 2.第一个一ts为后缀的文件&#xff0c;使用命令&#xff1a; tsc *.ts 就会生成对应…

electron 网页TodoList工具打包成win桌面应用exe

参考&#xff1a; electron安装&#xff08;支持win、mac、linux桌面应用&#xff09; https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程&#xff1a; 要将…

【吊打面试官系列-ZooKeeper面试题】Zookeeper 的典型应用场景

​大家好&#xff0c;我是锋哥。今天分享关于 【Zookeeper 的典型应用场景 】面试题&#xff0c;希望对大家有帮助&#xff1b; Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;开发人员可以使用它来进行分布式数据的发布…

学习React(状态管理)

随着你的应用不断变大&#xff0c;更有意识的去关注应用状态如何组织&#xff0c;以及数据如何在组件之间流动会对你很有帮助。冗余或重复的状态往往是缺陷的根源。在本节中&#xff0c;你将学习如何组织好状态&#xff0c;如何保持状态更新逻辑的可维护性&#xff0c;以及如何…

基于自组织映射的检索增强生成

大量数据用于训练大型语言模型 (LLM)&#xff0c;该模型包含数百万和数十亿个模型参数&#xff0c;目的是生成文本&#xff0c;例如文本补全、文本摘要、语言翻译和回答问题。虽然 LLM 从训练数据源中开发知识库&#xff0c;但总有一个训练截止日期&#xff0c;在此日期之后 LL…

java jts 针对shp含洞多边形进行三角剖分切分成可行区域

前言 java jts 提供了Delaunay三角剖分的相关方法,但是该方法不考虑含洞的多边形的。虽然 jts 的 ConformingDelaunayTriangulationBuilder 类可以通过提供线段约束的方式防止切割到洞内&#xff0c;但是仅支持最多99条线段&#xff0c;虽然可以通过重写破除99条线段的约束&am…

Java——————接口(interface) <详解>

1.1 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本电脑上的USB接口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#xff1a;U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上&#xff0c;可以插&#xff…