属性(property)与成员变量(ivar)有什么区别?

2023-11-02

@property 的本质是什么?
@property = ivar + getter + setter;
下面解释下:
“属性” (property)有两大概念:ivar(实例变量)、存取方法(access method = getter + setter)。
“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。这个概念已经定型,并且经由“属性”这一特性而成为Objective-C 2.0的一部分。 而在正规的 Objective-C 编码风格中,存取方法有着严格的命名规范。 正因为有了这种严格的命名规范,所以 Objective-C 这门语言才能根据名称自动创建出存取方法。其实也可以把属性当做一种关键字,其表示:
编译器会自动写出一套存取方法,用以访问给定类型中具有给定名称的变量。 所以你也可以这么说:
@property = getter + setter;
例如下面这个类:

@interface Person : NSObject 
@property NSString *firstName; 
@property NSString *lastName; 
@end
上述代码写出来的类与下面这种写法等效:

@interface Person : NSObject 
- (NSString *)firstName; 
- (void)setFirstName:(NSString *)firstName; 
- (NSString *)lastName; 
- (void)setLastName:(NSString *)lastName; 
@end
ivar、getter、setter 是如何生成并添加到这个类中的?
“自动合成”( autosynthesis)
完成属性定义后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”( autosynthesis)。需要强调的是,这个过程由编译器在编译期执行,所以编辑器里看不到这些“合成方法”(synthesized method)的源代码。除了生成方法代码 getter、setter 之外,编译器还要自动向类中添加适当类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字。在前例中,会生成两个实例变量,其名称分别为 _firstName与_lastName。也可以在类的实现代码里通过 @synthesize语法来指定实例变量的名字.

@implementation Person 
@synthesize firstName = _myFirstName; 
@synthesize lastName = myLastName; 
@end
我为了搞清属性是怎么实现的,曾经反编译过相关的代码,大致生成了五个东西:
1)OBJC_IVAR_$类名$属性名称 :该属性的“偏移量” (offset),这个偏移量是“硬编码” (hardcode),表示该变量距离存放对象的内存区域的起始地址有多远。
2)setter与getter方法对应的实现函数
3)ivar_list :成员变量列表
4)method_list :方法列表
5)prop_list :属性列表
也就是说我们每次在增加一个属性,系统都会在ivar_list中添加一个成员变量的描述,在method_list中增加setter与getter方法的描述,在属性列表中增加一个属性的描述,然后计算该属性在对象中的偏移量,然后给出setter与getter方法对应的实现,在setter方法中从偏移量的位置开始赋值,在getter方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转.

源自http://www.cocoachina.com/ios/20150803/1...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

属性(property)与成员变量(ivar)有什么区别? 的相关文章

  • 矩阵的迹及其性质

    目录 定义 性质 定义 设 A a i j
  • java开发安卓app教程

    前言 redis简单来说 就是一个数据库 不过与传统数据库不同的是 redis 的数据是存在内存中的 所以存写速度非常快 因此 redis 被广泛应用于缓存方向 另外 redis 也经常用来做分布式锁 redis 提供了多种数据类型来支持不

随机推荐

  • 实习的“黄金圈法则”,你了解多少?

    美国的西蒙 斯内克 是国际著名演讲家 微软 好莱坞等机构领导力顾问 他挖掘出的那些优秀领导者和企业成功的底层逻辑 被称为黄金圈法则 黄金圈法则揭示了伟大的领袖是如何激励和影响人们的行为的 运用这个法则 无论个人 组织还是企业 都将获得极大的
  • 聚簇索引,二级索引与联合索引的概念

    1 聚簇索引 聚簇索引并不是一种单独的索引结构 而是一种数据类型 用户所有的记录全部被存放到了b 树中的叶子节点 所谓索引即数据 数据即索引 聚集索引存储的数据结构为b 树 也就是说表被创建后 在磁盘里默认生成的就是b 树的结构 B 树分为
  • 【Redis学习】Redis10大数据类型

    总体概述 这里说的数据类型是value的数据类型 key的类型都是字符串 redis字符串 String string是redis最基本的类型 一个key对应一个Tvalue string类型是二进制安全的 意思是redis的string可
  • en结尾的单词_以en结尾的形容词

    以en结尾的形容词有broken fallen chosen sudden spoken laden litten rotten linen dozen等 以en结尾的形容词 en结尾的形容词 broken fallen chosen su
  • SPI通信以及与W2Q564(ROM)交换(读写)数据

    一 SPI协议简介 SPI 协议是由摩托罗拉公司提出的通讯协议 Serial Peripheral Interface 即串行外围设备接口 允许芯片与外部设备以全双工 同步 串行方式通信 此接口可以被配置成主模式 并为外部从设备提供通信时钟
  • TensorFlow的Session工作原理

    Session是Graph和执行者之间的媒介 Session run 实际上将graph fetches feed dict序列化到字节数组中 并调用tf session TF Run 参见 usr local lib python2 7
  • Flink 在唯品会的实践

    唯品会自 2017 年开始基于 k8s 深入打造高性能 稳定 可靠 易用的实时计算平台 支持唯品会内部业务在平时以及大促的平稳运行 现平台支持 Flink Spark Storm 等主流框架 本文主要分享 Flink 的容器化实践应用以及产
  • php rdkafka实例,【译】PHP Kafka客户端 - php-rdkafka

    本文翻译自php rdkafka的README 项目地址 PHP rdkafka是一个轻量的librdkafka封装 提供了一个 PHP 5 PHP 7 Kafka客户端 它支持高级和低级消费者 生产者 以及元数据API 它的API尽可能地
  • 交叉编译gstreamer

    编译gstreamer 1 3 2 gst plugins base 1 3 2 gst plugins good 1 3 2 gst plugins bad 1 3 2 gst plugins ugly 1 3 2 export PKG
  • 【解决】通用串行总线控制器全是感叹号

    系统 Win10 问题背景 更新某软件并重启后 USB插入外设无反应 问题查找 打开设备管理器 发现通用串行总线控制器下的设备驱动全部显示黄色感叹号 解决办法 1 运行注册表编辑器 开始 gt 运行 gt regedit 2 依次展开HKE
  • Pandas时间戳与时间差

    目录 时间戳 时间戳构造 时间戳序列生成 时间戳序列的索引与切片 使用布尔条件获取时间戳子序列 使用 索引切片获取时间戳子序列 使用dt对象获取时间戳子序列 dt对象详解 时间差 时间差生成 生成时间差序列 补充 时间戳 时间戳构造 imp
  • git 速度很慢的解决办法 git慢

    原因 git clone特别慢是因为github global ssl fastly net域名被限制了 只要找到这个域名对应的ip地址 然后在hosts文件中加上ip即可解决 查询github com地址 https ipaddress
  • 华医网自动答题小脚本软件,并收集答案保存起来

    华医网的考试有不固定性 比如出现题的顺序不同 选择出现的位置不同 这次是A下次不一定就是 要注意2个地方 一个是题的选择一般最多是5个选择所有最多就循环5次选择 自动答题 先用列表把题目和选择都保存起来 提交答案后如果是错的就删除如果是对的
  • Java基础:Java接口和抽象类

    文章目录 一 抽象类 1 1概念 1 2抽象类的特点 二 接口 2 1概念 2 2特点 2 3接口格式 2 4接口实现 2 5接口的继承 2 6接口与类相似点 2 7接口与类的区别 2 8抽象类和接口的区别 三 标记接口 一 抽象类 1 1
  • 增大计算机字体,怎么调整电脑字体大小?

    腾讯视频 爱奇艺 优酷 外卖 充值4折起 小编整理了以下几种方法 一 点击开始 控制面板 在控制面板中选择外观和个性化 在外观和个性化中 选择放大或缩小文本和其他项目 在这里我们选择中等125 点击应用 弹出了对话框提示是否重启 我们点击稍
  • Matlab实现最优化(附上多个完整仿真源码)

    最优化是一种寻找最优解的数学方法 它在各个领域都有广泛的应用 在Matlab中 有多种工具箱和函数库可以用来实现最优化 下面我们来介绍一下如何用Matlab实现最优化 1 定义目标函数 在开始最优化之前 需要定义一个目标函数 目标函数是一个
  • CRC校验算法及C++程序实现

    CRC校验可以运用于传输数据过程中的验证 发送端发送有效数据时 先根据有效数据和生成多项式 比如CCITT标准的多项式是X16 X12 X5 1 计算出CRC校验码 把CRC校验码加到有效数据后面一起发送 当接收数据时 取出前面有效数据部分
  • 单点区域生长算法

    1 理论基础 区域生长算法的基本思想是将有相似性质的像素点合并到一起 对每一个区域要先指定一个种子点作为生长的起点 然后将种子点周围领域的像素点和种子点进行对比 将具有相似性质的点合并起来继续向外生长 直到没有满足条件的像素被包括进来为止
  • [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题...

    问题描述 由单片机的VCC引脚供电 使用L298N控制两个电机 发现左右两个轮子的转速老是不一样 更多的情况是左轮转速高 左轮电机接OUT1和OUT2 右轮转速低 右轮电机接OUT3和OUT4 甚至不转 需要用手戳一下才转 在这种情况下 如
  • 属性(property)与成员变量(ivar)有什么区别?

    property 的本质是什么 property ivar getter setter 下面解释下 属性 property 有两大概念 ivar 实例变量 存取方法 access method getter setter 属性 proper