当前位置: 首页 > news >正文

effective-Objective-C 第一章阅读笔记 - 教程

文章目录

  • OC起源
  • 内存管理
  • 在类的头文件中尽量少引用其他头文件
  • 多用字面量语法
  • 多用类型变量,少用#define预处理
  • 枚举

OC起源

OC采用的是消息结构,不是函数调用,由Smalltalk演化而来。

消息结构的语言运行时所应执行的代码由运行环境来决定。

使用函数调用的语言则由编译器来决定

函数型语言和消息结构型语言在处理多态时,查找要执行的具体方法的时机和方式不同

  • 基于虚方法表的语言,如C++、Java在编译期,编译器知道类的继承关系和虚函数的签名,每一个类有一个虚方法表,表中存放该类的所有虚函数的实际内存地址,对象内部由一个隐藏指针vptr指向该类的虚表,当调用多态方法时,代码需要先通过对象的cptr指针找到虚表,在表中按照固定偏移找到函数地址,跳转执行。(运行时只查表)
  • 基于消息分发类的语言,如smalltalk、Ruby、早期OC,对象之间通过发送消息来调用方法,编译器通常不绑定方法地址,甚至都不检查方法存不存在,运行时,系统查找对象所属类的方法字典,按照消息名查找对应方法的实现,会沿着继承链向上查找,找不到触发消息无法处理的机制,如调用method_missing或抛出异常,开销比较大

内存管理

OC的部分语法与C语言相同,在OC中使用指针式来指示对象。

NSString* str - @"real.";

OC中所有对象都是一个objc_object结构体,我们操作的NSString* 等都是指向这些结构体的指针。这OC中的对象存储在堆/常量区。

NSString* str = @"real.";
NSString* antStr = str;

我们看一下这段代码的内存分布:

photo1

分配在堆中的内存必须直接管理,分配在1栈上的用于保存变量的内存会在其栈帧弹出时自动清理

OC采用引用计数管理堆区内存

比起创建结构体,创建对象需要额外的开销,所以有时候采用结构体可以节约内存。

在类的头文件中尽量少引用其他头文件

在类的头文件中,如果我们需要引入其他文件,使用@class就可以了,实现向前声明,还能避免循环引用

photo2

我们在引入协议时,不可以使用向前声明,因为向前声明只能告诉编译器某个协议的存在,而编译器需要知道协议中定义的方法。

多用字面量语法

OC为我们提供了许多语法糖,实现便携书写

NSNumber* number = @1
NSNumber* number = @1.6f
NSNumber* number = @YES
NSNumber* number = @'a'
NSNumber* bumber = @(80);
NSArray* ary = @[@"ll", @"gg", @"ff"];
ary[1]//字面量取法
NSDictionary* data = [@"123":@"213"];
data[@"123"];

在使用字面量语法时,我们需要尽量避免值出现nil,避免抛出异常

多用类型变量,少用#define预处理

#define ANIMATION_DURATION 0.8;

如果该宏定义在某个头文件中,那么所有引用这个头文件的代码都会被替换

static const int number = 20;

限制该变量只在当前编译单元中可见,避免其他文件被污染

同时可以遵守下面几个规则:

只在当前文件用的常量 → k 前缀

在其他类中可见的话,可以使用类名来做前缀

只要不打算公开这个常量,就在.m文件中定义,并使用static const修饰(保证当前文件可见以及不可修改)

如果不采用static的话,如果在另一个实现文件中定义一个同名变量会报错

其实采用static和const一起来修饰的话,编译器其实还是和#define一样的实现,但是他会有类型信息。

在某些情况下,我们需要给外部一个可见的常量,可以像下面这样定义:

extern NSString* *const tom;
extern const int duration;
//.h
NSString *const tom = @"mot"const int duration = 30;
//.m

注意const修饰的位置,与*结合就是说修饰一个常量指针,与NSString结合就是说修饰一个常量字符串

编译器看到头文件的extern之后就会将其添加到全局符号表中,需要注意避免名称冲突

枚举

enum CellType {
CellTypeSongs
};
typedef enum CellType CellType;
CellType state = CellTypeSongs;

在C++11之后我们可以指定使用何种底层数据类型

typedef enum : NSUInteger { //这里保证我们的一个底层数据类型是NSInteger
<MyEnumValueA>,<MyEnumValueB>,<MyEnumValueC>,} <MyEnum>;

我们也可以从某一个值开始手工枚举成员所对应的值。

enum CellType {
CellTypeSongs = 1,
CellTypeAlbum
};

在这里插入图片描述
通过组合枚举实现多选功能
在这里插入图片描述

http://www.jsqmd.com/news/439942/

相关文章:

  • 2026年企业管理咨询公司推荐:制造业升级场景深度评测,解决落地与成本痛点并附排名 - 品牌推荐
  • 介电常数测定仪哪家好?优质供应商实力推荐,精度高、服务更稳定! - 品牌推荐大师
  • 2026年在线非甲烷总烃连续监测系统推荐品牌与制造商,精准匹配您的监测需求 - 品牌推荐大师1
  • Flutter 三方库 args 的鸿蒙化适配指南 - 掌控工业级命令行解析、生产力工具实战、鸿蒙级自动化流水线专家
  • 网络安全工程师必备:SQL注入漏洞详解,附实战案例与防护方案,建议收藏学习
  • 大健康行业“割韭菜”的活不过3年:真正的打法都在用这3个阶段
  • 2026年多渠道支持+售后完善呼叫中心厂商实力对比 - 品牌2026
  • 新域半导体NS212:低成本HDMI2.0二切一芯片解决方案分辨率最高支持4K@60HZ功能替代ASW3642
  • 2026年企业管理咨询公司推荐:制造业实战评测,解决转型与增效核心痛点排名 - 品牌推荐
  • 2026年深圳全屋定制品牌推荐:基于多场景实测评价,针对环保与个性化痛点精准指南 - 品牌推荐
  • (电压击穿试验仪/体积电阻率测试仪/体积电阻率测定仪)供应商对比,这几点一定要看! - 品牌推荐大师
  • 四方杰芯FIS522X:高性能两通道数字隔离器
  • 电压击穿试验仪/体积电阻率测试仪/体积电阻率测定仪:正规供应商怎么挑?哪家质量稳定、售后有保障? - 品牌推荐大师
  • Linux——线程同步
  • 2026 AI 爆发:五大趋势重塑产品构建,错过等一年!
  • if really so important as a tt creator
  • 2026年深圳全屋定制品牌推荐:豪宅场景深度评测,解决品质与设计痛点并附排名 - 品牌推荐
  • LLM的注意力层,竟是长文档检索器?这项突破让RAG效果飙升!
  • NETCORE - IdentityServer4 多节点部署
  • 2026年企业管理咨询公司推荐:深度评价战略适配与组织增效,解决成本与效率核心痛点 - 品牌推荐
  • 2026年深圳全屋定制品牌推荐:高端家居趋势评测,涵盖大宅与精英圈层核心痛点 - 品牌推荐
  • Flutter 三方库 markdown 的鸿蒙化适配指南 - 掌控标准化文本渲染、高性能解析引擎实战、鸿蒙级内容展示专家
  • 5G 浪潮下的自智网络:海量信令数据的存储架构如何进化?
  • [AI智能体与提效-159] - Python语言优势与弱势
  • 2026年深圳全屋定制品牌推荐:高端家居趋势评测,涵盖大宅与改善场景核心痛点 - 品牌推荐
  • (电压击穿试验仪、体积电阻率测试仪、体积电阻率测定仪)供应商怎么选?厂家推荐哪家好? - 品牌推荐大师
  • SEAGULL模块化系统:对话实体智能体技术解析
  • endo-BCN-PEG8-amine,内型-BCN-八聚乙二醇-胺
  • antv3 x6 基本语法-边、节点、图片处理(七)
  • 导师推荐 9个AI论文写作软件:研究生毕业论文+开题报告高效写作工具测评