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. 新手学习FFmpeg - 通过API完成filter-complex功能

    本篇尝试通过API实现Filter Graph功能. 源码请参看 https://andy-zhangtao.github.io/ffmpeg-examples/ FFmpeg提供了很多实用且强大的滤 ...

  2. 你真的了解Grid布局吗?

    Grid网格布局 概述:Grid将容器划分为一个个网格,通过任意组合不同的网格,做出你想想要的布局 Grid与flex布局相似,将整个Grid分为了容器与子项(格子) Grid容器的三个重要的概念: ...

  3. 华为Quidway S5700开启SNMP协议

    开启SNMP协议通过Console口登录主要用于交换机第一次上电或者本地配置.或者无法通过远程访问时,可通过Console口登录.如何才能通过Console口登录交换机呢?在配置通过Console口配 ...

  4. JAVA父类的静态方法能否被子类重写?

    静态: 在编译时所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间,在实例化之前这个方法就已经存在于内存,跟类的对象没什么关系.子类中如果定义了相同名称的静态方法,并不会重写,而应 ...

  5. 第二场周赛(递归递推个人Rank赛)——题解

    很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...

  6. Java 中 Set、List 和 Map 的遍历

    java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. package tup.lucene. ...

  7. mysql简易导入excel

    方法-:利用excel本身的命令实现: 1 将excel文件中的数据转换成sql文件 (1)如图所示,我们在excel中执行如下语句 =CONCATENATE(“insert into table_n ...

  8. IPMI在linux下常用命令

    ipmitool lan print 1 ipmitool lan set 1 ipaddr 192.168.0.12 ipmitool lan set 1 netmask 255.255.255.0 ...

  9. 02 (OC)* ViewController 的声明周期

    一. UIViewController 的 生命周期 代码 示例 #pragma mark --- life circle // 非storyBoard(xib或非xib)都走这个方法 - (inst ...

  10. 25 个 Linux 下最炫酷又强大的命令行神器,你用过其中哪几个呢?

    本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux. 「运维之美」是一个有情怀.有态度,专注于 Linux 运维相关技术文章分享的公众号.公众号致力于为广大运维工作者分享各类技术文章和 ...