《编写高质量代码:改善Objective-C程序的61个建议》——建议8:C语言与Objective-C语言的关系是充分而非必要条件

简介:

本节书摘来自华章出版社《编写高质量代码:改善Objective-C程序的61个建议》一 书中的第2章,作者:刘一道,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议8:C语言与Objective-C语言的关系是充分而非必要条件

在众多武侠小说描述的武林界,武术泰斗张三丰,虽然师从少林觉远和尚,但是真人张三丰人集百家之长,融道家养身,刚柔相济,动静结合,以柔克刚,以静制动,而独创武当派。Objective-C和C语言的关系正如“武当和少林”的关系一样,两者虽有关系,但并非是继承关系,故称Objective-C是C语言的超集。
Objective-C 作为 C 程序设计语言的超集,支持与 C 相同的基本语法。会看到所有熟悉的元素,如基本类型(int、float 等)、结构、函数、指针,以及流程控制结构,如 if...else 语句和 for 语句。还可以访问标准 C 库例程,如在 stdlib.h 和 stdio.h 中声明的那些例程。
(1)C语言中每个标准变量类型在Objective-C中都可用,例如:

int someInteger = 42;
float someFloatingPointNumber = 3.1415;
double someDoublePrecisionFloatingPointNumber = 6.02214199e23;

(2)C语言中的标准运算符在Objective-C中可用,例如:

int someInteger = 42;
someInteger++;            // someInteger == 43
 
int anotherInteger = 64;
anotherInteger--;         // anotherInteger == 63
 
anotherInteger *= 2;      // anotherInteger == 126

(3)可用标量来表示Objective-C的属性,例如:

@interface XYZCalculator : NSObject
@property double currentValue;
@end

(4)通过点语法访问值时,可以在属性中使用C操作符,例如:

@implementation XYZCalculator
- (void)increment {
    self.currentValue++;
}
- (void)decrement {
    self.currentValue--;
}
- (void)multiplyBy:(double)factor {
    self.currentValue *= factor;
}
@end

点语法纯粹是对存取方法调用的一个语法包装,所以在这个例子中的每个操作相当于先使用get访问器方法来获取值,然后执行操作,最后使用set访问器方法来把该值设置为结果。
(5)在Objective-C中,定义了新的基本数据类型。BOOL标量类型在Objective-C中仍然被定义布尔值,其值表示为YES或NO。正如所料,YES逻辑上等同于true和1,而NO等同于false和0。在Cocoa和Cocoa Touch对象中方法中的许多参数,也可以使用特殊的标量数值类型,如 NSInteger 或 CGFloat。例如,如前一章所述,NSTableViewDataSource UITableViewDataSource协议都有方法要求要显示的行数:

@protocol NSTableViewDataSource <NSObject>
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView;
...
@end

这些类型,如 NSInteger 和 NSUInteger,类型不同的定义,这取决于目标架构。在32 位环境(如 iOS)生成时,它们是32位有符号和无符号整数;在64位环境 (如现代 OS X 运行时)时,它们是64位有符号和无符号整数。
如果要作可跨API边界(包括内部和导出的API)的应用,它的最佳实践是使用这些平台特定的类型,如应用代码和框架之间的方法或者函数调用的参数或返回值。
对于局部变量,如在一个循环计数器中,如果知道该值是标准限值内,使用基本的C类型是很好的。
(6)C语言中的数据结构在Objective-C中可保持其基本值。在一些Cocoa和Cocoa Touch API中,仍然使用C语言结构来保存它们的值。作为一个例子,它可能要向一个字符串对象来查询子串的范围,例如:

NSString *mainString = @"This is a long string";
NSRange substringRange = [mainString rangeOfString:@"long"];

同样,如果需要编写自定义的绘图代码,需要根据CGFloat相关的数据类型结构,与Quartz进行交互,如OS X 上的 NSPoint 和CGPoint,iOS 上的 NSSize 和 CGSize。再次,CGFloat会在不同的目标结构以不同方式来定义。
(7)Objective-C值对象比C 类型变量具有封装常用操作的优势。在Objective-C代码中,复制值对象,表示属性的对象,是一种很普遍的做法。C-类型的变量通常可以取代值对象,但值对象具有封装常用操作的优势。例如,NSString对象被用来代替字符指针,因为它们封装了编码和存储。
当值对象作为方法的参数被传递或者从一个方法被返回时,通常会使用对象的副本,而不是对象本身。例如,下面的方法将一个字符串赋值给对象的name实例变量。

- (void)setName:(NSString *)aName {
    [name autorelease];
    name = [aName copy];
}

存储aName的一个副本,其效果是产生一个独立于原始对象,但与原始对象具有相同内容的对象。副本的后续变化不会影响原始对象,并且原始对象的变化也不会影响副本。类似的,一种常见的做法是返回实例变量的副本,而不是实例变量本身。例如,下面的方法返回name实例变量的一个副本:

- (NSString *)name {
    return [[name copy] autorelease];
}

 要点
(1)C语言的基本语法在Objective-C语言中是可用的。
(2)与C语言相比,Objective-C语言又定义了新的基本数据类型,如BOOL等。
(3)Objective-C值对象比C 类型变量具有封装常用操作的优势,但在数值计算中,使用C类型标量更为简洁。

相关文章
|
4月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
6月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
133 1
|
6月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
173 1
|
2月前
|
Unix 编译器 C语言
[oeasy]python052_[系统开发语言为什么默认是c语言
本文介绍了C语言为何成为系统开发的首选语言,从其诞生背景、发展历史及特点进行阐述。C语言源于贝尔实验室,与Unix操作系统相互促进,因其简洁、高效、跨平台等特性,逐渐成为主流。文章还提及了C语言的学习资料及其对编程文化的影响。
31 5
|
6月前
|
编译器 C语言 计算机视觉
C语言实现的图像处理程序
C语言实现的图像处理程序
262 0
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
94 5
|
3月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
98 4
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
92 1
|
3月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
77 2
|
3月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
67 1

热门文章

最新文章