ObjC属性assign/retain/copy的区别?不同编程语言的属性?ObjC语言obj->name和obj.name的区别?类成员变量?

目录

ObjC属性assign/retain/copy的区别

ObjC语言obj->name和obj.name的区别

不同编程语言的属性

不同编程语言的属性特征

类成员变量

类静态成员和实例成员

只读的类成员

属性

属性的本质

编程语言属性的由来?


ObjC属性assign/retain/copy的区别

它们代表三种不同的引用方式,如下列出它们的内部逻辑。

self.property = value

  • assign
    property = value
  • retain
    if (property != value) {
    [property release];
    property = [value retain];
    }
  • copy
    if (property != value) {
    [property release];
    property = [value copy];
    }

注意copy属性需要实现NSCopying协议以完成深拷贝。

ObjC语言obj->name和obj.name的区别

ObjC语言支持属性,当obj是一个对象指针:

  • obj.name表示获取obj的name属性,等同于向obj对象发送name消息:[obj name].
  • obj->name类似C语言的访问结构体成员的写法,代表获取obj指针指向的name成员(此成员必须是public访问级别)。

不同编程语言的属性

  • C语言不支持属性。
  • ObjC: 支持属性较早的编程语言,2.0版本开始支持属性,使用@property和@synthesize声明和自动生成属性get/set代码。另外,ObjC 支持属性和成员变量同名。
    • 例如person对象有一个age属性,[person age]或person.age都代表获取age属性,person.age = <value>或[person setAge: <value>]都代表设置age属性。
  • C++:C++11开始引入了属性,并不是用于成员变量,而是给编译器提供信息,例如揭露函数是废弃的。
    • [[deprecated(“The function is deprecated”)]] void test();
    • 属性功能在Java/C#早期版本就有支持,C++是借用。
  • Java默认不支持类成员属性,需要手动写set/get方法模拟属性读写。
  • C#和Swift属性都可支持get/set可选属性。
    Swift还提供类型属性和静态属性,可为class而非实例提供属性读写,静态属性将不支持子类重写。当然,本质上,这两种属性都是“全局变量”。
    C#还支持自动属性AIP可以更简便创建属性。
  • Python提供类属性的hasattr和setattr判断类或者对象是否存在某个属性,并修改或新增属性(如果不存在)。
  • 仓颉 用 prop 定义属性。

不同编程语言的属性特征

  • ObjC: 支持属性较早的编程语言,使用@property和@synthesize声明和自动生成属性get/set代码。
    • 例如person对象有一个age属性,[person age]或person.age都代表获取age属性,person.age = <value>或[person setAge: <value>]都代表设置age属性。
  • C++:C++11开始引入了属性,并不是用于成员变量,而是给编译器提供信息,例如揭露函数是废弃的。
    • [[deprecated("The function is deprecated")]] void test();
    • 属性功能在Java/C#早期版本就有支持,C++是借用。
  • Java默认不支持类成员属性,需要手动写set/get方法模拟属性读写。
  • C#和Swift属性都可支持get/set可选属性。
    Swift还提供类型属性和静态属性,可为class而非实例提供属性读写,静态属性将不支持子类重写。当然,本质上,这两种属性都是“全局变量”。
  • Python提供类属性的hasattr和setattr判断类或者对象是否存在某个属性,并修改或新增属性(如果不存在)。

    类成员变量

    如果把类拆解开,和散布在不同位置的不同类型变量没什么区别。

    类静态成员和实例成员

    • 一般而言,只属于本类的是类静态成员,属于类对象的成员是实例成员。
    • C++/C#/Java/仓颉 等都支持类静态成员。
    • PHP/C++用类名 + :: 域作用符访问静态成员或类常量,C++用 . 或者 -> 访问实例成员,PHP用 -> 访问实例成员。
    • Python用类名 + . 访问静态成员,对象 + . 访问实例成员,C#/Java类似。Python定义静态成员不需要加所谓的static修饰符,放在类里面(和其他成员函数同级)即可。Python有自己的一套名词,叫类属性和实例属性。

    只读的类成员

    • 仓颉 let 修饰的成员变量,在初始化后不可修改。var 修饰的成员变量,不受此限制。

    属性

    属性对于C语言之前的编程语言比较陌生,C++之后的编程语言更多会采用。编程语言的属性分为两种:一种是成员变量的外在特性,一种是给编译器提供的可选信息。

    属性的本质

    编程语言属性并不是有新的实现,本质上是读或写方法。

    • C#中定义可读写的Sex属性,会自动创建get_Sex和set_Sex方法。如果你再次定义这两个方法,编译器会报错。
      error CS0082: 类型“XXX”已保留了一个名为“set_Gex”和“set_Sex”的具有相同参数类型的成员

    编程语言属性的由来?

    这里提到的"属性"是指对类字段封装,而非某些编程语言表征函数特征。在目前较为广泛使用的编程语言来看,ObjC是支持属性最早的语言,不过最早Simula语言已经有提出"属性"概念,只不过它和类字段或变量更接近。

    • 最重要的原因是,类成员读写操作会产生冗余代码,属性可以缓解。


      若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

      微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

      我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

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

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

      相关文章

      【蓝桥杯】12111暖气冰场(多源BFS 或者 二分)

      思路 这题可以用BFS做&#xff0c;也可以用二分来做。 用二分这里只提供一个思路&#xff1a;对时间来二分查找&#xff0c;check函数就是检查在特定的时间 t 0 t_0 t0​内每一个暖气炉的传播距离能否覆盖所有格子。 用BFS做&#xff1a; 由几个点开始向外扩散&#xff0c;知道…

      【云上CPU玩转AIGC】——腾讯云高性能应用服务HAI已支持DeepSeek-R1模型预装环境和CPU算力

      &#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大三学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

      【JavaEE】网络编程socket

      1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

      超硬核区块链算法仿真:联盟链PBFT多线程仿真实现 :c语言完全详解版

      1 22年年底想用gpt做出一个pbft的算法仿真&#xff0c;到了25年终于可以结合gpt grok perplexcity deepseek等实现了&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1.1简化版 // 定义 Windows 版本&#xff0c;确保条件变量相关函数可用 #define _WIN32_W…

      【并发编程】聊聊forkJoin的原理和最佳实践

      对于线程池来说&#xff0c;其实本质就是一个生产者消费者的模式&#xff0c;而通过竞争的方式从队列中获取任务执行。本质上其实就是按照任务级别进行处理&#xff0c;但是对于一些可以分而治之的任务&#xff0c;传统的线程池没有办法分治处理。一是无法对大任务进行拆分&…

      【数据预测】基于遗传算法GA的LSTM光伏功率预测 GA-LSTM光伏功率预测【Matlab代码#91】

      文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 遗传算法GA2. 长短期记忆网络LSTM3. 基于GA-LSTM的光伏功率预测4. 部分代码展示5. 运行结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 …

      Java 填充 PDF 模版

      制作 PDF 模版 安装 OnlyOffice 从 OnlyOffice 官网下载 OnlyOffice Desktop&#xff0c;安装过程很简单&#xff0c;一路下一步即可。用 OnlyOffice 制作 PDF 模版&#xff08;表单&#xff09; 使用 OnlyOffice 表单设计器&#xff0c;制作表单&#xff0c;如下图 注意命名…

      使用安装 Kettle 教程 Pentoho 10.2.0.0-222 安装 连接mysql

      流程 准备下载安装测试链接常见问题 准备 需要提前安装好 JDK 配置好环境变量 &#xff08;教程看前文&#xff09; 安装好mysql&#xff08;教程看前文&#xff09; 下载好pentaho链接数据库驱动 下载pentaho安装包 https://pentaho.com/wp-content/uploads/2024/04/three-s…

      MySQL表的增加、查询、修改、删除的基础操作

      MySQL表的增加、查询、修改、删除的基础操作 一、CRUD二、新增数据 insert2.1 单行数据 全列插入2.2 多行数据 指定列插入 三、查询 select3.1 全列查询&#xff08;select *&#xff09;3.2 指定列查询3.3 表达式查询3.4 去重&#xff1a;distinct3.5 带有排序的查询&#x…

      Windows Server 2025 使用 IIS 搭建 ASP.NET 3.5 网站

      开启远程桌面 参考文章Windows server开启远程桌面教程打开服务管理器。ECS 配置安全组&#xff0c;开启 3389Telnet 验证网络联通性 telnet x.x.x.x 338安装 Windows App&#xff0c;登录验证 安装 ASP.NET 3.5 1.参考文章Windows Server 2012安装 .NET Framework 3.5和 Wi…

      Linux上位机开发实战(能用的开发板计算资源)

      【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大家所能想到的嵌入式上位机开发&#xff0c;如果是linux&#xff0c;同时涉及到嵌入式的话&#xff0c;一般都会认为是把pc linux的软件port到板子…

      STM32中断

      中断的基本概念 中断具体定义&#xff1a;操作系统课程里有清晰的阐述。 STM32中断&#xff1a;中断来了&#xff0c;主程序都得立即暂停&#xff0c;程序由硬件电路自动跳转到中断程序中。中断执行前&#xff0c;进行现场保护&#xff1b;中断执行后&#xff0c;会再还原现场…

      maven在windows系统上的详细安装和配置

      下载 Maven 安装包 去官网下载&#xff0c;下载链接 下载到指定位置&#xff0c;解压&#xff0c;之后在该目录下新建一个文件夹 【repository】&#xff0c;作为本地仓库 Maven 的配置 配置本地仓库 ① 打开上一步新建的目录 repository&#xff0c; 复制路径 ② 打开 con…

      如何为AI开发选择合适的服务器?

      选择适合的服务器可以为您的AI项目带来更高的效率&#xff0c;确保最佳性能、可扩展性和可靠性&#xff0c;从而实现无缝的开发与部署。 选择适合的AI开发服务器可能并不容易。您需要一台能够处理大量计算和大型数据集的服务器&#xff0c;同时它还需要符合您的预算并易于管理…

      OpenCV中的矩阵操作

      OpenCV中的矩阵操作主要围绕Mat类展开&#xff0c;涵盖创建、访问、运算及变换等。 1. 创建矩阵 ‌零矩阵/单位矩阵‌&#xff1a; Mat zeros Mat::zeros(3, 3, CV_32F); // 3x3浮点零矩阵 Mat eye Mat::eye(3, 3, CV_32F); // 3x3单位矩阵 自定义初始化‌&#xff1a…

      【C++进阶】函数:深度解析 C++ 函数的 12 大进化特性

      目录 一、函数基础 1.1 函数定义与声明 1.2 函数调用 1.3 引用参数 二、函数重载&#xff1a;同名函数的「多态魔法」&#xff08;C 特有&#xff09; 2.1 基础实现 2.2 重载决议流程图 2.3 与 C 语言的本质区别 2.4 实战陷阱 三、默认参数&#xff1a;接口的「弹性设…

      spring boot 登入权限RBAC模式

      首先准备好5张表 user_info表&#xff0c;用户的信息表 role表&#xff0c;角色表&#xff08;比如超级管理员、管理员、审核员、采购......&#xff09; 创建user_role表&#xff0c;user_info表&#xff0c;role表的中间表 注意了&#xff0c;role_id和user_id是 u…

      C#里使用libxl来对列或行进行分组显示

      有时候由于EXCEL里的行数很多, 需要把某些行进行隐藏起来,那么就需要使用到行或列进行隐藏的操作。 这时候需要使用函数GroupCols和GroupRows来对这些列或行进行分组。 分组不能出现交叉的情况,否则会抛出异常。 如下图所示: 可以使用下面的代码来输出上面的EXCEL: p…

      LangChain 基础

      一、LangChain 模块和体系 LangChain 是一个用于开发由大型语言模型&#xff08;LLMs&#xff09;驱动的应用程序的框架。 官方文档&#xff1a;https://python.langchain.com/docs/introduction/ LangChain 简化了LLM应用程序生命周期的每个阶段&#xff1a; 开发&#xf…

      IDEA 快捷键ctrl+shift+f 无法全局搜索内容的问题及解决办法

      本篇文章主要讲解IDEA、phpStrom、webStrom、pyCharm等jetbrains系列编辑器无法进行全局搜索内容问题的主要原因及解决办法。 日期&#xff1a;2025年3月22日 作者&#xff1a;任聪聪 现象描述&#xff1a; 1.按下ctrlshiftf 输入法转为了繁体。 2.快捷键ctrlshiftr 可以全局检…