目录

一、核心概念

二、类的定义(分.h和.m文件)

1. 头文件(.h)—— 公开声明

2. 实现文件(.m)—— 具体实现

3.  属性特性解析

原子性

所有权语义(ARC环境下)

读写控制

三、对象创建与内存管理

1. 创建对象的两种方式

2. 关键步骤解析

3. instancetype

四、方法调用(消息传递机制)

1. 基本语法

2. 关键概念

五、self与super关键字

六、动手实践:完整工作流

1. 创建Person对象并调用方法

2. 项目结构

七、关键概念对比表

八、常见问题解答

相关推荐


一、核心概念

  1. :对象的蓝图(定义属性和方法)
  2. 对象:类的实例(内存中的具体实体)
  3. 方法:对象的行为(实例方法 - / 类方法 +

二、类的定义(分.h和.m文件)

1. 头文件(.h)—— 公开声明

#import <Foundation/Foundation.h>@interface SccUser : NSObject  // 继承NSObject// 属性声明(编译器自动生成getter/setter)
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;// 方法声明
- (void)sayHello;            // 实例方法
+ (void)run;                 // 类方法@end

编译器的自动合成:

  • 自动生成实例变量(默认带下划线前缀:_name_age)
  • 自动生成getter和setter方法
  • 根据属性特性自动处理内存管理

2. 实现文件(.m)—— 具体实现

#import "SccUser.h"@implementation SccUser- (void)sayHello {NSLog(@"say:HelloKitty");
}+ (void)run {NSLog(@"奔跑吧,类方法。");
}@end

3.  属性特性解析

属性特性分为三类:原子性、所有权语义和读写控制。

原子性
  • atomic(默认):线程安全的getter/setter,但性能稍低
  • nonatomic:非线程安全,但性能更好(推荐在单线程环境使用)
所有权语义(ARC环境下)
特性适用类型描述
strong对象类型默认值,保持强引用,引用计数+1
weak对象类型弱引用,不增加引用计数,对象释放后自动置nil(解决循环引用)
assign基本数据类型简单赋值,不进行引用计数管理(用于int, float, BOOL等)
copy对象类型(特别是NSString/NSArray等)创建对象的副本(保护不可变对象不被外部修改)
unsafe_unretained对象类型类似assign,但对象释放后不自动置nil(不安全,尽量用weak代替)
读写控制
  • readwrite(默认):生成getter和setter
  • readonly:只生成getter

三、对象创建与内存管理

1. 创建对象的两种方式

// 标准方式(推荐)
SccUser *user1 = [[SccUser alloc] init]; // 简化方式(等效于alloc+init)
SccUser *user2 = [SccUser new]; 

2. 关键步骤解析

方法作用
alloc分配内存(从堆区申请空间)
init初始化对象(设置默认值)

✅ 最佳实践:自定义初始化方法示例

// SccUser.h中添加
- (instancetype)initWithName:(NSString *)name;// SccUser.m中实现
- (instancetype)initWithName:(NSString *)name {self = [super init];if (self) {_name = name;  // 直接访问底层实例变量}return self;
}

3. instancetype

instancetype 是 Objective-C 引入的编译时类型检查关键字,用于表示:

"这个方法返回的实例类型,就是当前类的类型"

与 id 的对比(核心区别)

特性instancetypeid(通用对象指针)
类型安全性✅ 编译器会检查类型一致性❌ 绕过类型检查
代码智能提示✅ Xcode 提供精确的代码补全❌ 只能提示通用方法
继承场景行为✅ 子类继承时自动匹配实际类型❌ 永远返回 id
编译时优化✅ 编译器可进行静态分析❌ 无优化

四、方法调用(消息传递机制)

1. 基本语法

SccUser *user = [SccUser new];
// 无参数方法
[user sayHello];// 类方法
[SccUser run];// 带参数方法(冒号是语法关键)
[user setName:@"ShuaiciMain"];  // 等效于user.name = @"ShuaiciMain";// 多参数方法
[user userInfo:@"DaShuaiCi" is:18];

2. 关键概念

  • 选择器(SEL)@selector(sayHello) 表示方法签名
  • 消息传递[receiver message] 被编译为objc_msgSend(receiver, selector)

五、self与super关键字

关键字作用示例
self当前对象(类似Java/C++的thisself.name = @"Bob";
super调用父类实现[super init];

⚠️ 易错点:在init方法中必须用_name访问属性,避免触发未初始化的KVO


六、动手实践:完整工作流

1. 创建Person对象并调用方法

#import <Foundation/Foundation.h>
#import "SccUser.h"int main(int argc, const char * argv[]) {@autoreleasepool {// 1. 创建对象SccUser *alice = [[SccUser alloc] init];// 2. 设置属性(点语法本质是调用setter)alice.name = @"ShuaiciMain";// 3. 调用实例方法[alice sayHello];[alice userInfo:@"DaShuaiCi" is:18];// 4. 调用类方法[SccUser run];// 5. 使用自定义初始化SccUser *shuaici = [[SccUser alloc] initWithName:@"DaShuaiCi"];NSLog(@"自定义初始化:%@",shuaici.name);}return 0;
}

2. 项目结构

YourProject/
├── Person.h   // 头文件(声明)
├── Person.m   // 实现文件
└── main.m     // 程序入口

七、关键概念对比表

特性实例方法类方法
语法符号-(减号)+(加号)
调用对象类的实例类本身(如[Person ...]
内存归属对象内存空间类元数据空间
访问权限可访问实例变量不可访问实例变量
典型用途对象的具体操作工厂方法/工具类方法

八、常见问题解答

Q1:为什么属性用copy修饰字符串?

防止NSMutableString被意外修改(copy会创建不可变副本)

Q2:allocinit能分开调用吗?

可以但不推荐(可能产生未初始化对象):

Person *p = [Person alloc];  // 只有内存分配
p = [p init];                // 完成初始化

Q3:方法命名规范?

苹果官方要求:

  • 参数名嵌入方法名(sendData:toAddress:withTimeout:
  • 驼峰命名法(首个单词小写)

Q4:如何理解消息传递?

Objective-C运行时动态绑定过程:

  1. 通过isa指针查找对象类
  2. 在类的方法列表中查找SEL
  3. 若未找到则向父类传递消息
  4. 最终未处理则触发unrecognized selector异常

相关推荐

为何要学习Objective-C?从环境搭建开始-CSDN博客文章浏览阅读514次,点赞10次,收藏10次。在Objective-C开发中,你会频繁遇到以"NS"开头的类名和函数名,比如NSLog、NSString、NSArray等。这个"NS"前缀其实有着重要的历史渊源和技术含义。 https://shuaici.blog.csdn.net/article/details/148535298C语言基础精讲-CSDN博客文章浏览阅读10w+次,点赞413次,收藏2.1k次。C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结,C语言零基础入门绝对不是天方夜谭!_c语言基础知识 https://shuaici.blog.csdn.net/article/details/60570837

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

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

相关文章

CentOS 7 编译ClickHouse 24.8完整指南

前言 在CentOS 7上编译ClickHouse 24.8可能会遇到一些挑战&#xff0c;主要是因为CentOS 7的默认软件版本较旧。本文将详细介绍从零开始构建ClickHouse 24.8的完整过程&#xff0c;包括依赖安装和环境配置。 准备工作 首先确保系统已更新到最新版本&#xff1a; yum update…

Protocol Buffers (Protobuf) 全面解析

一、核心概念解析 1. 什么是数据序列化&#xff1f; #mermaid-svg-HZKw9iRlpQIRFiO3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HZKw9iRlpQIRFiO3 .error-icon{fill:#552222;}#mermaid-svg-HZKw9iRlpQIRFiO3 .…

高斯混合模型GMMK均值(十三-1)——K均值是高斯混合模型的特例

EM算法与K均值算法的关系 K均值可以看成是高斯混合模型的特例。 对K均值算法与EM算法进行比较后&#xff0c;可以发现它们之间有很大的相似性。K均值算法将数据点硬&#xff08;hard&#xff09;分配到聚类中&#xff0c;每个数据点唯一地与一个聚类相关联&#xff0c;而EM算法…

StarRocks 向量索引如何让大模型“记性更好”?

随着 ChatGPT、DeepSeek 等大语言模型的普及&#xff0c;我们已经能够与 AI 进行流畅的对话。然而&#xff0c;即使是最先进的大模型也面临着“记忆困境”&#xff0c;具体表现模型只能记住训练时接触的知识&#xff0c;且这些知识在使用时很可能会过期。实际应用或在处理特定领…

UniApp Vue3 模式下实现页面跳转的全面指南

1. 引言 1.1 UniApp 与 Vue3 的结合优势 UniApp 是一个使用 Vue.js 开发所有前端应用的框架,支持编译到 iOS、Android、H5、以及各种小程序平台。Vue3 提供了更高效的响应式系统和 Composition API,使开发体验更加现代化和灵活。 1.2 页面跳转在应用开发中的重要性 页面跳…

Solidity学习 - ABI 应用二进制接口

文章目录 一、ABI 基础概念1. ABI 与 API 的区别2. ABI 的核心作用 二、ABI 接口描述1. 编译后的产物2. ABI JSON 格式示例3. ABI JSON 关键字段说明 三、ABI 编码1. 编码示例2. 编码数据的组成3. Solidity 中的编码函数 四、ABI 解码1. 解码的基本概念2. 事件日志的解码 五、A…

星际争霸数据集指南

星际争霸作为检验AI效果的一个重要“模式生物”, 是验证AI技术的重要平台‌&#xff0c;尤其在 深度学习 和 强化学习领域。该游戏因其复杂的游戏机制和实时决策要求&#xff0c;为AI研究提供了丰富的测试环境和挑战。 本博文是记录自己曾经研究星际争霸AI时对于数据部分的一点…

VUE组件与组件之间的传参

每次启动vue2项目的时候在 vue.config.js中配置&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,//关闭语法严格检验lintOnSave:false})1&#xff1a;在 src 下 创建 utils 文件夹 然后创建 Bas…

8年java开发从零学习人工智能(深度学习)--pp飞桨(百度自研开源框架)

1.明确概念&#xff1a;人工智能>机器学习>深度学习&#xff0c;三者的关系是包含关系&#xff0c;如图所示&#xff1a; 人工智能&#xff08;AI&#xff09;&#xff0c;很宽泛的概念&#xff0c;是研发用于模拟&#xff0c;延展和扩展人的智能的理论&#xff0c;方法&…

ci | cd

ci | cd 相当于开发人员和运维人员共同完成的东西 ci:Jenkins cd:k8s ci &#xff1a; 持续集成 开发人员写出的代码提交到共享仓库 比如说Git 自动触发代码检查 测试 好处&#xff1a; 很快的发现bug 代码不用堆积 cd: 持续交付&#xff1a;代码测试没问题后 自动打包…

深入理解C#委托操作:添加、移除与调用全解析

关键词&#xff1a;委托不可变性 多播委托 调用列表管理 ⚙️ 一、委托的核心特性&#xff1a;不可变性 看似“添加”&#xff0c;实为新建 使用 为委托“添加”方法时&#xff08;如 delVar SCl.m3;&#xff09;&#xff1a; 系统创建全新委托对象新委托的调用列表 原…

Spring Cloud:微服务架构的基石与实践指南

一、Spring Cloud 核心组件 &#xff08;一&#xff09;Spring Cloud Netflix Spring Cloud Netflix 是 Spring Cloud 的核心模块之一&#xff0c;它集成了 Netflix 的多个开源组件&#xff0c;提供了微服务架构中常见的功能&#xff0c;如服务注册与发现、配置中心、API 网关…

【VPX3U】国产嵌入式平台:RK3588J×JH930硬件架构与红外应用方案

随着对边缘计算与多媒体处理需求的提升&#xff0c;国产异构平台成为关键发展方向。最近有一个项目需求&#xff0c;提出了一款基于瑞芯微 RK3588J 处理器与景嘉微GPU 的 VPX3U 规格嵌入式主板的设计想法旨在融合高性能异构计算与丰富的视频、网络和存储接口&#xff0c;适用于…

秩序密码-用群论分析魔方的阶

三阶魔方的物理基础是由一个三维十字轴连接的 6 个中心块&#xff0c;这 6 个中心块决定了魔方的 6 种颜色朝向&#xff0c;构成不动的坐标系统&#xff0c;此外还有两类活动块&#xff0c;分别是8个角块&#xff0c;12个棱块。 魔方的每一层转动&#xff08;如 R: 右层顺时针…

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考

Python驱动自动驾驶的“多眼”——打造高效传感器融合框架的实战思考 最近,自动驾驶行业火得不行,背后支撑它的技术,远不止车载摄像头那么简单。真正让车“看懂”世界的,是多种传感器数据的“融合”,包括雷达、激光雷达(LiDAR)、摄像头、惯性测量单元(IMU)等等。 而如…

机器学习-- 聚类

什么是聚类&#xff1f; Clustering 可以简单地说&#xff0c;对有标注的数据分类&#xff0c;就是逻辑回归&#xff08;属于有监督分类&#xff09;&#xff0c;对无标注的数据分类&#xff0c;就是聚类&#xff08;属于无监督分类&#xff09; 聚类是一种无监督学习技术&am…

【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南

文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本&#xff0c;接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标&#xff1a;tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…

BigFoot RaidSlackCheck11.109.zip lua

BigFoot RaidSlackCheck11.109.zip lua 合剂buff检查插件 把lua脚本拷贝到游戏插件目录下&#xff1a; D:\Battle.net\World of Warcraft\_classic_\Interface\AddOns 命令 /rsc 下载地址&#xff1a; https://download.csdn.net/download/spencer_tseng/91181827

深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师

在构建现代网页时&#xff0c;我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架&#xff0c;却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者&#xff0c;无声地承担着定义文档元数据、指导浏览器行为、优化搜…

青少年编程与数学 01-012 通用应用软件简介 11 应用商店

青少年编程与数学 01-012 通用应用软件简介 11 应用商店 一、什么是应用商店&#xff08;一&#xff09;应用商店的基本定义&#xff08;二&#xff09;应用商店的工作原理&#xff08;三&#xff09;应用商店的类型 二、应用商店的重要意义&#xff08;一&#xff09;为用户提…