@property详细解读

2023-11-13

@property 这个关键字、学过iOS的一定会经常用、但是如果你问一个人、@property是干嘛用的? 可能就会有人一脸茫然地问你:”不就是声明属性用的么?” 。这话当然对、那么@property的背后的机制是什么?是如果声明属性?做了哪些事情呢?

在讨论@property这个关键字之前、我们先说下iOS中、是如何声明变量的。

iOS声明变量的方法

在ARC下、生命变量有两种比较常用的方法:

方法一:

@interface ViewController : UIViewController
{
    @public NSString *price1;
}
@end

方法二:

@interface ViewController : UIViewController

@property (nonatomic, copy) NSString *price2;

@end

ARC中、很多人应该都是使用方法二了、那么方法一和方法二有什么区别?

@property 是声明一个属性、而在大括号里面是声明一个成员变量。属性可以理解为对外暴露的成员变量、不仅内部可以使用、对外也是可以调用。(是的、即使你在.h中使用大括号中public声明、对外还是不可以引用这个变量)

在使用的过程中、两者也有区别、方法一的变量、可以直接使用

price1 = @"price1"; 

但是方法二的属性、就必须用self. 或者 _

self.price2 = @"price2";

or

_price2 = @"price2";

那么、是什么引起了这些不同呢?
答案是:@property会在编译过程、自动给属性增加getter 和 setter方法、从而使属性能够真正拥有属性的特性(被外部读取、使用self.读取)


生成setter 和getter 方法

刚才提到、@property的一个很重要的功能就是自动生成getter和setter方法。我们先看下代码。

这个最简单的getter 和setter方法

- (void)setPrice:(NSString *)price
{
    _price = price;
}

- (NSString *)price{
    return _price;
}

上面的方法看起来是没有问题的、但当我们理解了iOS的内存管理之后、很多人就会觉得不太对劲、如果这么写setter和getter方法、内存该乱套了吧。下面说明下property的另外一个用处:内存管理。


内存管理

当我们真正使用@property的时候、其实不会简单的使用

@property NSString *price;

常见的是

@property (nonatomic, copy)NSString *price;

copy等属性、是如何影响内存管理的呢?

如果是copy、setter方法就变成了

- (void)setterPrice:(NSString *)price {
    _price = [price copy];
}

如此、我们就通过property的属性、实现了内存的管理

综上、property通过自动生成setter和getter方法、并且使用属性、实现了iOS的内存管理。

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

@property详细解读 的相关文章

  • 如何退出 Instagram API?

    Instagram API 身份验证页面没有任何有关如何注销用户的信息 在使用 API 的 iOS 应用程序上 我该如何允许用户注销 要注销用户 您只需删除令牌即可 如果用户不希望您的应用访问他们的数据 他们将取消您的应用访问权限 如果您想
  • 错误:“会员中心没有注册任何设备”- UDID 无效?

    我收到错误 找不到匹配的配置文件 针对您的 UDID 所选团队没有 iOS 开发者计划成员资格 是的 它有 它处于活动状态 和 无法创建配置文件 因为您的团队没有在会员中心注册设备 请连接设备并启用开发 然后将其添加到会员中心 我已经在会员
  • 如何在 IOS 中以编程方式使 TTTAttributedLabel 居中对齐

    我正在开发一个应用程序 其中有一个由带有前缀 的标签组成的字符串 我正在使用 TTTAttribute Label 添加指向给定字符串中具有前缀 的单词的链接 当我添加 TTTAttribute 标签的链接时 它已成功添加 当单击它时 我可
  • 比较ios中的两个时间值? [复制]

    这个问题在这里已经有答案了 在我的应用程序中 我想检查当前时间是在变量中保存的时间之前还是之后 就像我的时间1一样time1 08 15 12 我的时间2是time2 18 12 8 所以我想比较 time1 和 time2 目前这些变量是
  • UICollectionView - 水平滚动,水平布局?

    我有一个UIScrollView布置了一个图标网格 如果您能够想象 iOS Springboard 的布局 那么您的想法就非常接近正确了 它有一个水平的分页滚动条 就像 Springboard 一样 不过 布局似乎不太对劲 看起来好像是从上
  • 使用简洁形式的 NSManagedObjectID URI?

    在我的应用程序中 我使用 Core Data 以及不使用 Core Data 的附加 sqlite 数据库 在这个附加数据库中 我有一些列存储对NSManagedObject实例通过每个实例的NSManagedObjectID 我得到一个实
  • 如何检查用户是否具有有效的身份验证会话 Firebase iOS?

    在呈现我的应用程序的主视图控制器之前 我想检查用户是否仍然有有效的会话 我使用最新的 Firebase API 我想如果我使用遗产 我就能知道这一点 这是我到目前为止所做的 我在Firebase的Slack社区上发布了我的问题 没有人回答
  • 我可以在 React Native 中需要一个专门用于 iOS 的模块吗?

    我目前正在使用react native safari view https github com naoufal react native safari view我的 React Native 项目中用于在 iOS 中显示 Web 视图的模
  • 带有图层圆角半径和阴影的 UILabel

    我正在寻找一种方式来显示UILabel with layer cornerRadius and layer shadow 我发现 与label clipsToBounds true the cornerRadius将被设置并与label m
  • 如何在 iOS (ObjC) 中安排每日本地推送通知?

    无法安排每日本地PushNotification以正确的方式 我只想在上午 9 00 显示一个每日本地 PushNotification 其中包含今天的计数任务 我的代码只执行一次didFinishLaunchingWithOptions
  • 如何在 Swift 中正确测试 Core Data

    已经有很多关于此的主题 但我还没有找到适用于 Swift Xcode 6 2 的解决方案 为了在 Swift 中测试 Core Data 支持的类 我生成了新的托管对象上下文 然后将其注入到我的类中 Given let testManage
  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • 从后台线程显示的 UIAlertView 并且没有委托创建 EXC_BAD_ACCESS

    这是我的代码 ifdef DEBUG UIAlertView alertView UIAlertView alloc initWithTitle ERROR message JSON Parsing Error delegate nil c
  • 动画 UIButton 上的用户交互

    我正在尝试在 Xcode 4 2 中制作一个针对 iPhone 的小应用程序 我想要的是一个UIButton使屏幕向下动画 当你按下它时 你将它的 alpha 设置为 0 我找到了一种方法UIView能够处理用户交互的类 并得出以下代码 U
  • 跨不同的 viewController 使用相同的 UIWebView

    TL DR 我需要实现一个在多个 ViewController 之间共享的单例 UIWebVIew 这个问题包含了我迄今为止的所有方法 应用程序委托 property strong nonatomic UIWebView singleWeb
  • 分段表单上传和 NSURLSession.uploadTaskWithRequest 之间的区别

    来自网络编程领域 我非常喜欢使用多部分表单请求来上传文件 然而 在iOS中 我们有一个东西叫做NSURLSession用方法uploadTaskWithRequest 这似乎是调用进行图像上传等操作的方法 您能解释一下这两种方法之间的区别吗
  • Xcode 7.1 在归档 swift ios 应用程序时挂起

    Xcode 7 1 在归档应用程序时 挂在 复制 Swift 标准库 处 知道为什么吗 对于面临同样问题的其他人 在尝试了其他所有方法并失败后 通过重新启动 mac 来修复它 D
  • Delphi TListBox iOS 制作新的项目样式/行为

    我需要显示自定义数据 为了example我需要显示包含姓名 描述和照片的联系人列表 理想情况下 我还想在那里显示自定义数据 例如用于发起电话呼叫的按钮 默认样式不太符合我的要求 但相当接近 因此 据我所知 如果我可以创建自定义样式 TLis
  • 如何使用 UIImagePickerController CropRect

    我刚刚找到了一种方法来更改裁剪框的矩形 该裁剪框在捕获图像后出现UIImagePickerViewController 这可以在以下帮助下完成UIImagePickerControllerCropRect 但我不知道如何使用它 最初的裁剪框
  • 如何复制添加到 StoryBoard 中 ViewController 的 UIView 并保持约束?

    我创建了一个视图 CustomView xib 和一个专用类 CustomView swift 我已通过添加视图并将自定义类设置为 CustomView swift 将其添加到 Storyboard 中的 ViewController 中

随机推荐

  • 实践指南-前端性能提升 270%

    一 背景 当我们疲于开发一个接一个的需求时 很容易忘记去关注网站的性能 到了某一个节点 猛地发现 随着越来越多代码的堆积 网站变得越来越慢 本文就是从这样的一个背景出发 着手优化网站的前端性能 并总结出一套开发习惯 让我们在日常开发时 也保
  • 无网环境下安装Mysql8.0

    在redhat7 6操作系统上安装mysql8 0服务 服务器只有内网 没有外网 记录一下安装过程 一 软件准备 1 1 下载mysql安装包 下载地址 https dev mysql com downloads mysql 1 2 准备依
  • Vue3 ERROR Error: Cannot find module ‘vue-loader-v16/package.json‘

    Vue3 ERROR Error Cannot find module vue loader v16 package json Vue3 npm run serve错误 1 主要错误信息 2 Vue3项目 运行环境 3 Vue3项目运行操作
  • 金山办公慢下来了?

    大数据产业创新服务媒体 聚焦数据 改变商业 只有长期主义者 才能成为时间的朋友 在笔者看来 越来越向SaaS模式倾斜的金山办公便是 长期主义 的代表之一 近日 金山办公 股票代码 688111 发布2023年半年度报告 报告显示 2023上
  • 如何用python提取音频

    可以使用 Python 的多种库来提取音频 其中一种方法是使用 ffmpeg 库 首先 需要安装 ffmpeg 库 可以使用以下命令进行安装 pipinstall ffmpeg 然后 可以使用以下代码来提取音频 import ffmpeg
  • 一个在ASP.NET中利用服务器控件GridView实现数据增删改查的例子

    备注 这是我辅导的一个项目开发组的一个例子 用文章的方式分享出来 给更多的朋友参考 其实我们这几年的项目中 都不怎么使用服务器控件的形式了 而是更多的采用MVC这种开发模式 但是 如果项目的历史背景是用服务器控件的 也不妨继续沿用 以免变动
  • Rust引入外部包,VsCode引入失败,Blocking waiting for file lock on package cache lock

    引入外部包出错的解决方法 VsCode导入包后一直转圈 首先要停掉Rust server Ctrl Shift P 快捷键 输入Stop那个 停掉服务 改用命令行 像这样 可以看到它说 Blocking waiting for file l
  • ChatGLM环境配置

    目的 ChatGPT令人震撼的冲击下 笔者转向NLM的Transformer模型 ChatGLM作为清华开源的大语言模型 笔者尝试了其环境配置 为相关理论学习奠定基础 本文用于备忘与学习 无商业用途 参考 ChatGLM的源码下载链接 Gi
  • 总结24个Python接单赚钱的平台,兼职月入5000+

    如果说当下什么编程语言最靠谱或者比较适合搞副业 答案肯定100 是 Python python是所有语法中最简单易上手的语言 不需要特别的的英语词汇量 逻辑思维也不需要很差就能上手 而且学会了之后就能编写代码爬取各种数据 制作各种图表 提升
  • Android学习路线

    Android学习路线 绝对干货
  • CVE-2021-44228-log4j2复现详细版本-简单教程。

    0x01 前言 昨晚爆出的log4j rce 是通过lookup触发的漏洞 但jdk1 8 191以上默认不支持ldap协议 对于高版本jdk 则需要一定的依赖 不过为了给大家最简单的说明 我这里还是用jdk1 8 144的版本来运行 0x
  • Pytorch-torch.nn.identity()方法详解

    Pytorch torch nn identity 方法详解 identity模块不改变输入 直接return input 一种编码技巧吧 比如我们要加深网络 有些层是不改变输入数据的维度的 在增减网络的过程中我们就可以用identity占
  • Web 前端常用正则校验规则

    Web 前端常用正则校验规则 作为 Web 前端开发 常用的正则校验规则有很多 下面是一些常见的示例 1 校验手机号码 手机号码的正则表达式可以根据不同国家和地区的手机号码格式进行调整 以下是中国大陆的手机号码正则表达式 const reg
  • 关于C语言fgets函数要注意的地方

    关于C语言fgets函数要注意的地方 fgets函数一般用来读入文件内容 每次读一行 然后存入缓存区 有人问那怎么读下一行 直至读完整个文本文件的内容 其实很简单 只要循环用fgets就行 如果你这次把第一行读完了 那么下一次文件指针就会从
  • 关于springboot中编写继承JpaRepository这个接口类时出现报红,不能继承这个接口的问题之解决方法

    这是第二次遇到这个问题只能怪自己之前没有习惯去记录遇到的问题 这次还是关于Jpa的 真的是在找博客的时候看到好多说在入口类里添加 EnableJpaRepositories basePackages xxx xxx xxx 这个注解的 我就
  • el-table-column中运用三元运算符

    在el table column中是不能直接运用三元运算符的 需要转化一下
  • Nacos2.2版本发布了,我为其贡献了几行代码并适配了PostgreSQL插件

    目录 一 背景 二 个人贡献 三 Nacos使用适配的PostgreSQL插件 3 1 插件源码工程项目结构 3 2 打包加载插件 3 3 修改配置文件为PostgreSQL连接字符串 3 4 导入数据库脚本文件 四 总结 一 背景 Nac
  • Springmvc 学习心得

    1 三层架构的介绍和mvc的设计模式 Springmvc的特点 清晰的角色划分 每个功能模块对应一个组件 1 前端控制器 DispatchServlet 2 处理器映射器 HanderMapping 根据 requestMapping 找到
  • Java单元测试框架-1-TestNg初识

    目录 1 1xUnit整体作用 1 2着重介绍Junit TestNg 1 3TestNg测试框架介绍 1 4Eclipse安装TestNG 1 5TestNg测试 1 1xUnit整体作用 xUnit是各种代码驱动测试框架的统称 这些框架
  • @property详细解读

    property 这个关键字 学过iOS的一定会经常用 但是如果你问一个人 property是干嘛用的 可能就会有人一脸茫然地问你 不就是声明属性用的么 这话当然对 那么 property的背后的机制是什么 是如果声明属性 做了哪些事情呢