【OC】类与对象

类与对象

  • 定义类
    • 接口部分
    • 定义成员变量
    • 方法说明
    • 实现部分
  • 对象的产生与使用
  • 对象与指针
  • self关键字
    • 避免重复创建
  • id类型
  • 方法详解
    • 方法的所属性
    • 形参个数可变的方法
  • 成员变量
    • 成员变量及其运行机制
    • 多个实例中内存示意图
    • 模拟类变量
    • 单例模式

 类是面向对象的重要内容,我们可以把类当成一种自定义的数据类型,可以使用类来定义变量,这种类型的变量相当于指针类型的变量。也就是说,所有的类都是指针类型的变量

定义类

面向对象程序设计中有两个很重要的概念:类与对象(也叫做实例)。类是对一批对象的抽象。类实际上是某种概念,人才是实体。例如我们日常接触到的同学, 实际上都是实例,可以理解成人这个集合当中的某个元素。

同时OC定义类分为两部分
接口部分:定义类所包含的成员变量以及方法
实现部分:为该类的方法提供实现

接口部分

 interface的意思是接口,@interface用于声明定义类的接口部分。@end表示结束。
后面的花括号用于声明成员变量。花括号后面的部分用于声明该类的方法
成员变量:用于描述该类对象的状态数据,例如一个人的身高体重
方法:用于描述该类的行为,
同时接口声明放在h文件中

定义成员变量

与C语言类似,但是要以下划线"_" 开头。
同时成员变量应该以一个或多个有意义的单词连缀,一般遵循第一个单词首字母小写,后面每个单词首字母大写,其余字母均小写。
在这里插入图片描述

方法说明

同时方法声明的语法说明如下:
1.方法类型表示: 要么是+要么是-。+就代表是类方法,在调用方法是必须用类来调用。-就代表是实例方法,调用时要用实例来调用,实例可以理解成用类来创建的对象。
2.方法返回值: 与C语言类似
3.方法签名关键字: 由方法名,形参标签,冒号组成
 以我们的例子来说明:pname是我们的方法名,n是我们的传入的形参,NSString是我们的数据类型
注意 pname 与 pname: 是两种不同的方法
前者不带冒号说明是一个不带形参的方法
后者这是一个带有形参的方法

实现部分

在这里插入图片描述
1.实现部分的类名必须与接口部分的类名相同以确保是同一个类的接口部分以及实现部分
2.类实现部分必须为类声明部分的每个方法提供方法定义,同时在实现部分定义的方法,只能在类实现部分进行使用
在这里插入图片描述

对象的产生与使用

定义类之后我们就可以使用类了,我们要分以下三步来使用类

定义变量
类名*变量名;(一定要记得有星号)
创建对象
[[类名 alloc] init] (记得alloc关键字是写在里面的)
调用类方法
蔡徐坤 打:篮球
这很符合我们的自然语言的习惯,需要主谓宾。
蔡徐坤作为主语,也就是方法调用者,他既可以是类,也可以是实例。
打作为我们的的谓语,实际上就是方法。
篮球作为宾语,实际上就是我们调用方法时需要传入的参数。

在这里插入图片描述
在这里插入图片描述
对象的产生与使用
在这里插入图片描述

对象与指针

我们在前面的.m代码中有这样一行代码

FKperson* person = [[FKperson alloc] init];

这行代码创建了一个EKPerson实例,也被称为EKPerson对象。然后我们将这个对象赋给变量person。
在这里插入图片描述
可以看出不同内存块分别存储了不同的成员变量。 当我们把对象赋给EKPerson*
变量时,实际上让这个变量指向了对象在内存中的首地址。因为EKPerson* 变量实际上是一个指针类型的变量。
形象的说,可以认为这个变量指向实际的对象
在这里插入图片描述

self关键字

避免重复创建

OC中提供了一个self关键字,self关键字总是指向调用该方法的对象。
self关键字的最大作用是让类中的一个方法访问该类的另一个方法或成员变量,从此我们可以理解我们的self关键字一般是在实现部分使用。
在讲解self前我们先来看一个问题
在这里插入图片描述
–因为我们的方法必须由对象或者类调用,因此我们在run方法中调用jump方法时,正常的思路应该是先创建一个对象,然后通过这个对象来调用其他方法。但实际上我们并不用那么麻烦。
–因为我们在run方法中调用jump方法是一定需要一个对象的,但是我们不一定需要在主函数之外重新创建一个对象。
–我们在调用run方法时,主函数一定会提供一个FKPerson对象。这样我们就可以直接调用使用这个已经存在的对象。 因此我们用self关键词来让run方法中获得调用该方法的对象,也就是主函数中创建的对象。
 self总是代表当前类的对象,当出现在方法体时,它所代表的对象是不确定的,但是类型是确定的,它所代表的对象只能是当前类的实例。当我们在主函数中调用方法时,他的对象就确定了。谁调用这个方法,self就代表谁。
但是self却不能出现在类方法中,因为self所代表的是一个实例,而不是一个类
在这里插入图片描述

id类型

OC提供了一个id类型,这个id类型可以代表所有对象的类型。
也就是说所有实例都可以赋给id类型的变量
当通过id类型的变量来调用方法时,OC将会执行动态绑定。
在这里我们需要注意:OC将会在运行时判断该对象所属的类以及确定需要动态调用的方法,而非在编译时确定要调用的方法。
在这里插入图片描述
重点:在运行时检测到该变量所需要指向对象的类型为FKPerson

方法详解

方法是类或对象行为特征的抽象。从功能上看,方法完全类似于函数。但是方法不能独立存在。要么属于类,要么属于对象。

方法的所属性

在这里插入图片描述

形参个数可变的方法

在定义方法是在最后一个形参名后面增加逗号与三点(, …),则表明该形参可以接受多个参数值

我们声明了一个NSString*的形参,除了name参数之外,表示还可接受个数可变的NSString参数。
为了获取个数可变的参数,我们还需要用如下关键字。

va_list:这是一个数据类型,用于定义指向可变参数列表中的指针变量。
va_start: 这是一个函数,该函数指定开始处理可变形参的列表,并让指针变量指向可变形参列表中的第一个参数。
va_end:结束处理可变形参,释放指针变量。
va_arg:返回获取指针当前指向的参数的值,并将指针移动到下一个参数。
上面这些方法为test方法提供了实现。
在这里插入图片描述

成员变量

OC中根据定义变量的位置不同,将变量分为三大类:成员变量,局部变量,全局变量。

全局变量:在前面,还没看,由函数演化而来。
局部变量:方法中定义的变量。
因为这两个在前面都有讲解但是笔者还没看,所以在这里着重讲解成员变量

成员变量及其运行机制

成员变量:在类接口部分或类实现部分定义的变量。
OC的成员变量都是实例变量,并不支持真正的类变量
实例变量从实例被创建开始存在,直至系统完全销毁这个实例。实例变量可理解为实例成员变量,它作为实例的一个成员,与实例共存亡。
在这里插入图片描述
与c语言不同,成员变量无需显式初始化,只要为一个类定义了实例变量,系统会为实例变量执行默认初始化。基本类型的实例变量默认初始化为0,指针类型的成员变量默认初始化为nil.

多个实例中内存示意图

在这里插入图片描述

模拟类变量

通过内部全局变量来模拟类变量
static修饰局部变量表示将该局部变量存储到静态存储区,修饰全局变量用于限制全局变量只能在当前源文件访问

为了模拟类变量,我们在实现部分定义一个static修饰的全局变量,并提供一个类方法来暴露全局变量。
我们在接口部分声明两个类方法分别用于修改与获取类变量
在这里插入图片描述

单例模式

如果一个类始终只能创建一个实例,则这个类被称为单例子类。
单例类可通过static全局变量来实现,程序考虑定义一个static全局变量,该变量用于保存已创建的Singleton对象
每次程序获取该实例时,程序会先判断static全局变量是否为nil,如果为nil则初始化一个实例并赋值给全局变量
在这里插入图片描述
我们通过使用instance方法来获取Singleton实例时,程序最多只会产生一个Singleton实例,我们在main函数中测试这个类时,将可以看到我们产生的singleton对象实际上是同一个对象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【问题解决】adb remount 失败或刷机无法连接设备(KaiOS)

问题描述 1、设备无法adb remount成功, 2、通过fastboot无法识别设备,一直卡住 3、已经识别到9008端口,但是设备与刷机工具connect fail,甚至软件crash 解决方案 1、安装高通驱动工具:QDLoder HS-USB Driver QDLoade…

【工作必备知识】Linux磁盘I/O故障排查分析定位 iostat 介绍

【工作必备知识】Linux磁盘I/O故障排查分析定位 iostat 介绍 大家好,我是秋意零。 前言:今天,介绍Linux磁盘I/O故障排查时,必备命令iostat。该命令是监视系统I/O设备使用负载,它可以实时监视IO设备,从而帮…

Python数据分析II

目录 1.HS-排序返回前n行 2.HS-相关性 3.缺失值处理 4.时间 5.时间索引 6.分组聚合 7.离散分箱 8.Concat关联(索引关联) 9.Merge关联(字段关联) 10.join合并(左字段,右索引) 11.行列转置及透视表 12.数据可视化-面向过程 13.数据可视化-面向对象 14.快速生成柱状…

10秒钟docker 安装Acunetix

1、拉取镜像: 2、查看镜像: [rootdns-server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/hiepnv/acunetix latest f8415551b8f4 2 months ago 1.98GB 3、运行镜像: …

msfconsole利用Windows server2008cve-2019-0708漏洞入侵

一、环境搭建 Windows系列cve-2019-0708漏洞存在于Windows系统的Remote Desktop Services(远程桌面服务)(端口3389)中,未经身份验证的攻击者可以通过发送特殊构造的数据包触发漏洞,可能导致远程无需用户验…

已解决Error || IndexError: index 3 is out of bounds for axis 0 with size 3

已解决Error || IndexError: index 3 is out of bounds for axis 0 with size 3 原创作者: 猫头虎 作者微信号: Libin9iOak 作者公众号: 猫头虎技术团队 更新日期: 2024年6月6日 博主猫头虎的技术世界 🌟 欢迎来…

Android安全开发之 Provider 组件安全

Android系统中的Content Provider组件是一种用于在不同应用之间共享数据的机制。它提供了一种安全、可控的方式,允许应用访问其他应用的数据。然而,如果Provider组件的安全措施没有得到妥善实现,则可能会导致严重的安全漏洞,例如数…

电阻常见失效模式

电阻常见失效模式: 电阻器由于结构较为简单,工艺成熟,通常失效率相对较低。器失效主要表现为以下几种: 阻值漂移:老化后通常发生;(通过老化试验进行筛选,规避该问题) …

万能表单与AI的完美融合,打造个性化AI小程序

在人工智能技术日益成熟的今天,如何将AI智能与用户界面无缝结合,已成为软件开发领域的新挑战。MyCms 以其创新的“万能表单结合AI”功能,为开发者提供了一个全新的解决方案,让个性化AI小程序的开发变得前所未有的简单和高效。 一、…

OBS 录屏软件:录制圆形头像画中画,设置卡通人像(保姆级教程,有步骤图,建议收藏)

Mac分享吧 文章目录 一、OBS录屏软件 圆形头像画中画效果注意:圆形画中画仅需要在软件中设置一次,每次录制,使用带有圆形头像画中画的场景 录制视频即可。该场景不可删除!!!若删除,则需要重新设…

奇安信停服,国内还有什么可用的高防么?

这里写自定义目录标题 背景DDOS怎么办?方案推荐总结 背景 继前段时间百度云加速通知免费服务,6月底奇安信也将停止服务,到时候国内将几乎不存在免费好用的高防CDN了;类似的事情还有阿里云和腾讯云的一年期免费SSl证书也都停止供应…

day31贪心算法part01| 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

**455.分发饼干 ** 视频讲解 | 力扣链接刚开始想到的&#xff0c;但是这样太暴力了&#xff0c;太笨了 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 胃口g 饼干尺寸sint result 0;sort(s.begin(), s.end());…

苍穹外卖笔记-08-套餐管理-增加,删除,修改,查询和起售停售套餐

套餐管理 1 任务2 新增套餐2.1 需求分析和设计接口设计setmeal和setmeal_dish表设计 2.2 代码开发2.2.1 根据分类id查询菜品DishControllerDishServiceDishServiceImplDishMapperDishMapper.xml 2.2.2 新增套餐接口SetmealControllerSetmealServiceSetmealServiceImplSetmealMa…

通过 Webhook 将消息推送至钉钉、飞书、企业微信

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 当我们在 VPS 与 NAS 上部署了大量的应用&#xff0c;如何优雅的接收推送消息就成了一个大问题&#xff0c;在“上古时代”最常用的莫过于 SMTP 直接发送邮件进行通知&#xff0c;但当推送的消息过多且频繁…

《编程小白变大神:DjangoBlog带你飞越代码海洋》

还在为你的博客加载速度慢而烦恼&#xff1f;DjangoBlog性能优化大揭秘&#xff0c;让你的网站速度飞跃提升&#xff01;本文将带你深入了解缓存策略、数据库优化、静态文件处理等关键技术&#xff0c;更有Gunicorn和Nginx的黄金搭档&#xff0c;让你的博客部署如虎添翼。无论你…

认识Spring中的BeanFactoryPostProcessor

先看下AI的介绍 在Spring 5.3.x中&#xff0c;BeanFactoryPostProcessor是一个重要的接口&#xff0c;用于在Spring IoC容器实例化任何bean之前&#xff0c;读取bean的定义&#xff08;配置元数据&#xff09;&#xff0c;并可能对其进行修改。以下是关于BeanFactoryPostProce…

Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息

0 前言 在开展系统安全检查的过程中&#xff0c;除了收集cpu信息&#xff0c;我们还需要收集内存信息。在Linux中&#xff0c;获取内存信息的命令很多&#xff0c;这里我们着重研究 cat /proc/mem命令。 1 cat /proc/mem命令 /proc/meminfo 文件提供了有关系统内存的使用情况…

每日复盘-20240607

今日关注&#xff1a; 这几天市场环境不好&#xff0c;一直空仓。 六日涨幅最大: ------1--------605258--------- 协和电子 五日涨幅最大: ------1--------605258--------- 协和电子 四日涨幅最大: ------1--------605258--------- 协和电子 三日涨幅最大: ------1--------0…

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题

20240605解决飞凌的OK3588-C的核心板刷机原厂buildroot不能连接ADB的问题 2024/6/5 13:53 rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh --help rootrootrootroot-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lun…