面向对象(上) 📅 发布时间:2026/7/8 18:57:37 👁️ 浏览次数: 面向对象(上)5.1 类与对象类是一种自定义数据结构就像c语言的结构体那样但它的功能比结构体更丰富类是一种概念而对象才是具体存在的类的声明和使用定义类需要两个步骤接口部分interface,定义该类包含的成员变量和方法实现部分implementation为该类的方法提供实现这是一个类的声明部分#import Foundation/Foundation.h interface fkperson : NSObject { NSString* _name; int _age; } - (void) setName : (NSString*) name andAge : (int) age; - (void) say : (NSString *) content; - (NSString*) info; (void) foo; endinterface用于声明定义类的接口部分end用于表明定义结束成员变量描述该类的对象的状态数据方法用于描述该类的行为#import fkperson.h implementation fkperson { ...... } - (void) setName : (NSString*) name andAge : (int) age{ ...... } - (void) say : (NSString *) content{ ...... } - (NSString*) info{ ...... } (void) foo{ ...... } end类实现部分的类名必须和类接口部分的类名一致类实现部分也可以声明自己的成员变量但仅可以在当前类内访问类实现部分必须为类声明部分的每个方法提供方法定义对象的产生与使用对象的产生类名 *对象名 [[类名 alloc] init]; Person *p [[Person alloc] init];这其实是两步常被写成一步:为对象分配内存也就是allocinit初始化这个对象当然也可以用自己的方法初始化(将init改写)或者带参数的构造方法Person *p [[Person alloc] initWithName:Alice age:18];对象的使用有两种方式访问对象一种是点语法另一种是消息发送方式p.name Tom; NSString *n p.name; [p setName:Tom]; NSString *n [p name];5.2方法在上一节类中我们发现其中就有方法的身影 简单来说方法其实就是类中的一个函数方法类型符号调用者示例实例方法-对象- (void)run类方法类名 (void)info实例方法实例方法是通过对象调用用-开头类方法通过类名调用用开头#import Foundation/Foundation.h interface fkperson : NSObject { NSString* _name; int _age; } - (void) setName : (NSString*) name andAge : (int) age; - (void) say : (NSString *) content; - (NSString*) info; (void) foo; end[fkperson foo];//调用foo类方法 fkperson* person [[fkperson alloc] init]; [person info];//调用info实例方法并且在实例方法中可以引用类方法但在类方法中不能引用实例方法 (void)foo { NSLog(调用了 FKPerson 的 foo 类方法); // 类方法中不能访问实例变量/实例方法如 self-_name、[self info] 都会报错 } // 实现实例方法 info - (void)info { NSLog(调用了 FKPerson 的 info 实例方法); // 实例方法中可以访问类方法如 [FKPerson foo] [FKPerson foo]; }5.4封装在 Objective-C 中封装的核心落地手段是属性的 Setter赋值方法和 Getter取值方法—— 它们是类对外暴露属性的 “可控接口”既允许外部合法访问数据又能隐藏内部的存储细节和校验逻辑是 “开放封闭原则” 的典型体现Setter控制属性的赋值逻辑实现数据校验、内存管理如 copy/strongGetter控制属性的取值逻辑实现懒加载、数据格式化、只读保护等。基础用法自动生成 自定义实现自动生成interface Person : NSObject // 声明属性编译器自动生成 Setter/Getter property (nonatomic, copy) NSString *name; // 字符串用 copy 避免浅拷贝 property (nonatomic, assign) NSInteger age; // 基本类型用 assign end implementation Person // ARC 下无需手动实现编译器自动生成以下逻辑 // - (NSString *)name { return _name; } // - (void)setName:(NSString *)name { _name [name copy]; } // - (NSInteger)age { return _age; } // - (void)setAge:(NSInteger)age { _age age; } end // 外部通过 Setter/Getter 访问无需关心内部存储 Person *p [[Person alloc] init]; p.name 张三; // 等价于 [p setName:张三] p.age 25; // 等价于 [p setAge:25] NSLog(姓名%年龄%ld, p.name, p.age); // 等价于 [p name]、[p age]自定义生成当自动生成的逻辑无法满足需求时如数据校验可自定义 Setter 或 Getterimplementation Person // 自定义 age 的 Setter校验年龄合法性 - (void)setAge:(NSInteger)age { // 拦截负数、超过150的非法年龄 if (age 0 || age 150) { _age 0; // 重置为合法默认值 NSLog(年龄不合法已自动修正为0); } else { _age age; } } // name 的 Getter 沿用自动生成的即可 end // 测试非法赋值被拦截 p.age 200; // 输出年龄不合法已自动修正为0 NSLog(年龄%ld, p.age); // 结果0区分 “点语法” 和 “实例变量”点语法p.age本质是调用 Setter/Getter会触发校验、懒加载等逻辑直接访问实例变量p-_age跳过 Setter/Getter直接修改内存破坏封装严禁在类外部使用。用readonly修饰属性编译器仅生成 Getter不生成 Setter实现 “只读” 封装5.6 对象创建与初始化在 Objective-C 中对象的创建通常需要两个步骤分配内存和初始化对象。只有经过初始化的对象才能正常使用。5.6.1 对象的创建过程创建对象通常写成下面的形式Person*p[[Person alloc]init];这个语句实际上包含两个步骤allocalloc方法负责为对象在堆内存中分配空间并返回对象的地址。initinit方法用于对对象进行初始化例如给成员变量赋初值。因此对象创建流程可以理解为alloc → 分配内存 init → 初始化对象只有两个步骤都完成后对象才算真正创建成功。5.6.2 自定义初始化方法在很多情况下系统默认的init方法并不能满足需求我们需要自己编写初始化方法来设置对象的初始状态。例如interfaceUser:NSObjectpropertyNSString*name;propertyintage;propertyNSString*address;end实现自定义初始化implementationUser-(instancetype)init{self[superinit];if(self){_name默认名字;_age18;_address北京;}returnself;}end初始化方法通常遵循一个固定模板-(instancetype)init{self[superinit];// 调用父类初始化方法if(self){// 初始化成员变量}returnself;}这样写的好处是如果父类初始化失败返回nil子类也不会继续执行初始化代码。5.6.3 带参数的初始化方法除了默认的init方法还可以定义带参数的初始化方法这样在创建对象时可以直接设置属性值。例如interfaceCar:NSObjectpropertyNSString*brand;propertyNSString*model;propertyNSString*color;-(instancetype)initWithBrand:(NSString*)brand model:(NSString*)model;-(instancetype)initWithBrand:(NSString*)brand model:(NSString*)model color:(NSString*)color;end实现implementationCar-(instancetype)initWithBrand:(NSString*)brand model:(NSString*)model{if(self[superinit]){_brandbrand;_modelmodel;_color黑色;}returnself;}-(instancetype)initWithBrand:(NSString*)brand model:(NSString*)model color:(NSString*)color{if(self[selfinitWithBrand:brand model:model]){_colorcolor;}returnself;}end这种写法的优点是可以减少重复代码提高代码复用性创建对象时更加灵活示例Car*car1[[Car alloc]init];Car*car2[[Car alloc]initWithBrand:奔驰model:ML350];Car*car3[[Car alloc]initWithBrand:宝马model:X5color:黑色];5.7 继承继承是面向对象编程的重要特性之一它可以让一个类获得另一个类的属性和方法从而实现代码复用。在 Objective-C 中继承通过:语法实现interface子类:父类end其中被继承的类称为父类superclass继承父类的类称为子类subclass5.7.1 继承的基本特点继承的主要作用包括代码复用子类可以直接使用父类已有的方法和属性。扩展功能子类可以在父类基础上增加新的功能。层级关系继承可以形成类的层次结构。例如interfaceFruit:NSObjectpropertydoubleweight;-(void)info;end实现implementationFruit-(void)info{NSLog(这是一个水果重量为 %g g,self.weight);}end定义一个子类interfaceApple:FruitendimplementationAppleend创建对象并调用方法Apple*a[[Apple alloc]init];a.weight200;[a info];由于Apple继承自Fruit所以它可以直接使用父类中的weight属性和info方法。5.7.2 Objective-C 的继承规则Objective-C 采用单继承机制即一个类只能有一个父类但可以形成多层继承例如NSObject ↓ Vehicle ↓ Car ↓ SportsCar这种结构称为继承链。5.7.3 方法重写Override子类不仅可以继承父类的方法还可以重新实现父类的方法这称为方法重写。例如父类interfaceBird:NSObject-(void)fly;endimplementationBird-(void)fly{NSLog(小鸟在天空飞翔);}end子类interfaceOstrich:Bird-(void)callSuperMethod;end实现implementationOstrich-(void)fly{NSLog(鸵鸟不会飞只能奔跑);}-(void)callSuperMethod{[superfly];}end说明子类重写了fly方法使用super可以调用父类原来的实现测试Ostrich*o[[Ostrich alloc]init];[o fly];// 调用子类方法[o callSuperMethod];// 调用父类方法
智能农人:基于机器学习的精准施肥建议系统设计与实现 引言:为什么我们需要精准施肥? 在传统农业生产中,农民往往依靠经验或统一标准进行施肥,这种做法存在诸多问题: 过量施肥:导致土壤盐碱化、水体富营养化 施肥不足:影响作物产量和品质 养分失衡:氮磷钾比例不当,降低肥料利用率 环境负担:农业面源污染加剧 精准施肥… 2026/7/8 10:55:17
基于深度学习的鼠患智能监测系统:从数据到部署的全栈实战指南 摘要 鼠患监测是公共卫生和农业防护中的重要课题。传统的监测方法依赖人工巡查或物理触发器,效率低下且存在盲区。本文将带领读者从零构建一套基于计算机视觉的鼠患智能监测系统,涵盖数据采集、模型训练、算法优化到边缘部署的全流程。我们将使用YOLOv8作为核心检测算法,并… 2026/7/6 7:19:18
基于springboot的外卖管理系统设计与实现 一、系统概述本 “速食达” 外卖系统以 Java 为核心开发语言,后端基于 SpringBoot 框架搭建高可用的服务架构,前端采用 Vue 框架实现交互友好的页面展示,数据库选用 MySQL 存储全量业务数据。系统面向用户、管理员、商家三类角色设计差异化功… 2026/7/8 9:38:14
HackMe-1 靶机实战:SQL注入到文件上传的 3 步完整攻击链复现 HackMe-1 靶机实战:从SQL注入到文件上传的完整攻击链剖析靶机环境与攻击路径总览HackMe-1是VulnHub平台上专为渗透测试学习者设计的初级难度靶机,其核心价值在于完整呈现了Web应用中三个典型漏洞的串联利用过程。与真实企业环境中常见的漏洞组合模式高度… 2026/7/8 20:22:53
Upload-Labs Pass-02/03 实战:Content-Type与黑名单绕过,2种方法成功率100% Upload-Labs靶场实战:Content-Type与黑名单绕过的双保险策略在Web安全领域,文件上传漏洞始终是渗透测试中的重点突破口。本文将深入剖析Upload-Labs靶场中Pass-02和Pass-03关卡的核心防御机制,通过两种成功率100%的实战绕过方法,带… 2026/7/8 20:22:53
OWASP ZAP 2.15 与 Burp Suite 2024 对比评测:5 大核心功能与实战效率分析 OWASP ZAP 2.15 与 Burp Suite 2024 对比评测:5 大核心功能与实战效率分析在Web应用安全测试领域,两款工具始终占据着行业讨论的中心——开源的OWASP ZAP与商业化的Burp Suite。2024年,随着ZAP 2.15版本的发布与Burp Suite年度更新的推出&… 2026/7/8 20:20:52
Unlock Music终极指南:3步解锁加密音乐,重获数字音乐所有权 Unlock Music终极指南:3步解锁加密音乐,重获数字音乐所有权 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web … 2026/7/8 20:20:52
UDS 0x29 vs 0x27 安全服务对比:从种子密钥到PKI证书的5个关键差异 UDS 0x29 vs 0x27 安全服务对比:从种子密钥到PKI证书的5个关键差异 在汽车电子诊断领域,UDS(统一诊断服务)协议中的安全机制一直是保障车辆数据完整性和功能安全的核心。随着车联网技术的快速发展,传统的0x27安全访问服… 2026/7/8 20:18:52
UDS 0x29 服务 APCE 模式实战:基于 OpenSSL 生成 X.509 证书的 5 步配置 UDS 0x29 服务 APCE 模式实战:基于 OpenSSL 生成 X.509 证书的 5 步配置 1. 汽车诊断安全认证的技术演进 在智能网联汽车快速发展的今天,传统基于种子密钥(Seed & Key)的27服务已无法满足日益增长的网络安全需求。ISO 14229-… 2026/7/8 20:18:52
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08