【iOS】《Effective Objective-C 2.0》阅读笔记(一)

【iOS】《Effective Objective-C 2.0》阅读笔记(一)

前言

  最近开始阅读一些iOS开发的相关书籍,第一本就是《Effective Objective-C 2.0》,这里对第一周的阅读内容进行简单归纳和总结,主要是熟悉OC语言。

了解OC语言的起源

  OC语言由Smalltalk演化而来,其使用“消息结构”而非“函数调用”。

Smalltalk 起源于 20 世纪 70 年代的施乐帕洛阿尔托研究中心(Xerox PARC)。它是在当时计算机科学研究蓬勃发展的背景下诞生的,是面向对象编程(OOP)领域的先驱语言。
早期的 Smalltalk 主要用于研究和实验先进的编程概念。图构建一种能够模拟人类认知和交互方式的编程语言。例如,在当时传统的编程语言以过程式编程为主流时,Smalltalk 独树一帜地强调对象之间的消息传递。

对象是核心
在 Smalltalk 中,所有的实体都是对象。无论是简单的数据类型,如整数、字符、布尔值,还是复杂的用户自定义的数据结构,都被视为对象。例如,一个简单的整数对象 “5”,它不仅包含了数值本身,还包含了一系列可以对这个数值进行操作的方法。这些方法以消息传递的方式被调用,就好像这个整数对象能够 “理解” 并执行某些指令一样。
这种对象的概念是非常彻底的。以字符串对象为例,一个字符串对象可以接收诸如 “长度计算”“字符提取”“拼接其他字符串” 等消息,通过这些消息的传递来实现对字符串的各种操作。

消息传递机制
消息传递是 Smalltalk 中对象之间交互的主要方式。当一个对象需要另一个对象执行某个操作时,它会向对方发送一个消息。例如,假设有一个表示图形的对象和一个表示绘图工具的对象。图形对象可能会向绘图工具对象发送一个 “绘制我” 的消息,绘图工具对象收到消息后,会根据图形对象的属性(如形状、颜色等)来执行绘制操作。
消息可以带参数,也可以不带参数。比如,一个数字对象向另一个数字对象发送 “加法” 消息时,会带上要相加的数值作为参数。这种机制类似于人类之间的交流,一个对象 “请求” 另一个对象做某事,使得代码的逻辑更加符合自然的思维方式。

类与继承
类是创建对象的模板。在 Smalltalk 中,类定义了对象的属性和行为。例如,定义一个 “动物” 类,它可能包含 “名称”“年龄” 等属性,以及 “移动”“发出声音” 等行为(通过方法定义)。
继承是 Smalltalk 中实现代码复用和层次化设计的重要手段。例如,定义一个 “哺乳动物” 类继承自 “动物” 类,“哺乳动物” 类可以继承 “动物” 类的所有属性和行为,同时还可以添加自己特有的属性和行为,如 “喂奶” 等行为。这使得代码的组织结构更加清晰,符合现实世界中生物分类的逻辑。

对于消息和函数调用的区别,可以通过如下代码来体现:

//Messaging(OC)——"消息结构"
Object *obj = [Object new];        
[obj performWith:parameter1 and:parameter2];
        
//Function calling(C++)——“函数调用“
Object *obj = new Object;
obj->perform(parameter1, parameter2);

消息结构和函数调用的关键差别在于:使用消息结构的语言,其运行所应执行的代码由运行环境来决定;而使用函数调用的语言,则由编译器决定。

OC的重要工作都由“运行期组建”而非编译器来完成。OC是C的“超集”,所以C语言中的所有功能在编写OC时仍然适用 。
OC语言中的指针是用来指示对象的。想要声明一个变量。令其指代某个对象,可用如下语法:

NSString *someString = @"The string";

上述代码声明了一个名为someString的变量,其类型为NSString*,即此变量为指向NSString的指针。所有的OC语言的对象声明必须以指针的形式,因为对象所占内存总是分配在“堆空间(heap space)”中,而绝不会在“栈(stack)”上

someString变量指向分配在堆里的某块内存,其中含有一个NSString对象,若再创建一个变量,令其指向同一地址,如下:

NSString *someString = @"The string";
NSString *anotherString = someString;

则并不会拷贝该对象,只是两个变量同时指向一个对象。即只有一个NSString实例,但有两个变量指向此实例,两个变量都是NSString类型。如图:

但是,在OC中有时会遇到定义里不带有
的变量,它们可能使用到“栈空间”,这些变量保存的不是CO对象。例如:

CGRect frame;
frame.origin.x = 0.0f;
frame.or
转载请说明出处内容投诉
CSS教程网 » 【iOS】《Effective Objective-C 2.0》阅读笔记(一)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买