Objective-C语言使用的是"消息结构"而非"函数调用"

"消息结构"和"函数调用"之间的区别

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

  • "函数调用"的语言: 由编译器决定

//Messaging (Objective-C) 消息结构
Object *obj = [Object new];
[obj performWith:parameter1 and:parameter2]; //Function calling (C++)方法调用
Object *obj = new Object;
obj->perform(parameter1,parameter2);

内存模型:Objective-C语言中的指针是用来指示对象的

  • Objective-C为C语言添加了面向对象特性,是其"超集",C语言的所有功能在编写OC代码时依然适用!

  • Objective-C语言中的指针是用来指示对象的。

  • 对象所占内存总是分配在"堆空间"(heap space)中,不能在栈(stack)中分配对象。

NSString *someString = @"the string";
/**说明:
上面代码是声明一个名为someString的变量,类型是NSString *。看就是说,此变量为指向NSString的指针。
Objective-C对象所占内存分配在“堆空间”中,绝对不会分配在“栈”上。
所以someString变量指向分配在堆里的某块内存,其中含有一个NSString对象。
*/
//再创建一个变量,令其指向同一地址,那么并不拷贝对象,只是这两个变量会同时指向此对象
NSString *anotherString = someString; /**说明:
两个NSString *类型变量指向一个NSString实例。
当前“栈帧”里分配两块内存,每块内存大小都能容下一枚指针。(在32位架构计算机是4字节,64位架构计算机是8字节)。这两块内存里的值都一样,都是NSString实例的内存地址。
*/

  • 分配在堆中的内存必须直接管理,Objective-C是通过"引用计数"这一内存管理架构来管理,而分配在栈上用于保存变量的内存则会在其栈帧弹出时自动清理。

  • Objective-C定义的不含*的变量通常是非对象类型的变量(基本数据类型和结构体)。他们使用的是"栈空间"(stack space)

struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;

要点

  • Objective-C为C语言添加了面向对象特性,是其超集。

  • Objective-C使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型。

  • 接受一条消息之后,究竟应执行何种代码,由运行期环境而非编译器来决定。

52个有效方法(1) - 了解Objective-C语言的起源的更多相关文章

  1. 第一章 熟悉Objective -C 编写高质量iOS与OS X代码的52 个有效方法

    第一章 熟悉Objective -C   编写高质量iOS与OS  X代码的52 个有效方法   第一条: 了解Objective-C 语言的起源 关键区别在于 :使用消息结构的语言,其运行时所应执行 ...

  2. iOS书摘之编写高质量iOS与OS X代码的52个有效方法

    来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...

  3. 笔记 《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 》

    阅读此书的笔记点: 此书目录即是对知识点最好的总结 第1章 熟悉Objective-C ---------------------------------------------- 第1条:了解Obj ...

  4. 《编写高质量iOS与OS X代码的52个有效方法》书籍目录

    一.熟悉Objective-C 1.了解Objective-C语言的起源 2.在类的头文件中尽量少引入其他头文件 3.多用字面量语法,少用与之等价的方法 4.多用类型常量,少用#define预处理指令 ...

  5. 编写高质量iOS代码的52个有效方法2-1

    一.变量的定义位置(用{}声明示例变量或者用@property属性声明实例变量) 1.用{}声明示例变量: 此方法生命的实例变量,编译器在编译时,会自动计算其偏移量(表示该变量距离存放对象的内存区域的 ...

  6. 编写高质量iOS代码的52个有效方法1-1

    一.使用向前声明(@class)的好处 1.有效减少编译器编译的时间: 2.有效避免循环引用: 二.字面量语法的好处 1.字面常量 精简.可用于所有数据类型,如: NSNumber *intNumbe ...

  7. 编写高质量iOS与OS X代码的52个有效方法

    第一章重点: 第一条:OC的起源 OC由smalltalk语言演化而来的语言为消息结构(messaging structure)语言,其运行时所因执行的的代码由运行环境来决定:函数调用(functio ...

  8. 52个有效方法(4) - 多用类型常量,少用#define预处理指令

    局部常量 在实现文件中使用 static const 来定义"只在编译单元内可见的常量"(translation-unit-specific constant).其命名规则为在前面 ...

  9. 【读书笔记】--《编写高质量iOS与OS X代码的52个有效方法》

    1.Objective-C 起源: 在 C 语言基础上添加了面向对象特性,是 C 语言的超集.Objective-C 由 SmallTalk 语言演变过来,使用消息结构,运行环境由运行环境决定. OC ...

随机推荐

  1. C#开发BIMFACE系列25 服务端API之获取模型数据10:获取楼层对应面积分区列表

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列22 服务端API之获取模型数据7:获取多个模型的楼层信息>中,返回的楼层信息结果中包含了楼层的具体信 ...

  2. VUE中CSS样式穿透

    VUE中CSS样式穿透 1. 问题由来 在做两款H5的APP项目,前期采用微信官方推荐的weui组件库.后来因呈现的效果不理想,组件不丰富,最终项目完成后全部升级采用了有赞开发的vant组件库.同时将 ...

  3. go 学习笔记之学习函数式编程前不要忘了函数基础

    在编程世界中向来就没有一家独大的编程风格,至少目前还是百家争鸣的春秋战国,除了众所周知的面向对象编程还有日渐流行的函数式编程,当然这也是本系列文章的重点. 越来越多的主流语言在设计的时候几乎无一例外都 ...

  4. 作为一名Android开发者,你有过迷茫吗?

    前言 经常听新进的小白问道,Android是不是饱和了?想写一篇关于Android开发者忧虑的文章很久了,今天才提起勇气写.最近不管是在微信.QQ群,还是在各大博客网站,都随处听得到Android开发 ...

  5. Redis是否安装

    1.Redis对否安装(安装好了会出现下面对应的代码) [lk@localhost /]$ whereis redis-cli redis-cli: /usr/local/bin/redis-cli ...

  6. Winform中使用zxing实现二维码生成(附dll下载)

    场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 新建Winform程序,将上面 ...

  7. kafka入门配置

    问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行“随机读写”的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? ...

  8. py-faster-rcnn的常见错误

    在py-faster-rcnn配置运行faster-rcnn-end2end-VGG-CNN_M_1024的过程中, 执行命令:./experiments/scripts/faster_rcnn_en ...

  9. /bin/java: 没有那个文件或目录spark/bin/spark-class:行71: /usr/java/jdk1.8

    1.检查java环境有没有问题 2.1没问题后检查文件的编码是否有问题

  10. Hadoop入门 之 Hadoop的安装

    1.安装Hadoop的三大步骤 答:1.Linux环境,2.JDK环境,3.配置Hadoop. 2.安装Linux 答:利用阿里云,腾讯云等公有云.选择Ubuntu进行安装,然后利用小putty进行操 ...