【高质量Objective-C-2】第1条:了解Objective-C语言的起源

Objective-C:

类似于面向对象的语言C++、Java,

但OC与它们有很多不同。

若用过某种面向对象语言,

则很容易理解OC所用的范式与模板。

【一、语言按照方法的调用方式,分两类】

1.“消息结构”语言(messaging structure)

2.“函数调用”语言(function calling)。

Smalltalk是消息型语言的鼻祖。

OC由Smalltalk演化而来,

即:OC采用消息结构语言。

区别:

比较:

动态绑定

编译器不关心接收消息的对象的类型;

由运行时环境决定接收消息的对象。

(参见第11条)

静态绑定:

编译期,由编译器决定调用的方法。


【二、OC的运行时组件:Objective-C Runtime Component

作用:完成OC的许多重要工作。

包含:OC的面向对象的全部数据结构与方法。

本质:是与开发者所编写的代码相链接的“动态库”(Dynamic Library)。

它能粘合开发者写的代码。

“运行时”语言:更新运行时组件,

即可提升应用程序性能。

“编译时”语言:这种语言的许多工作,

都在“编译期”(compile time)完成,

所以,要提升性能,只能重新编译应用程序代码。

OC是C的超集,故OC代码包含了C语言所有功能。

必须同时掌握OC与C的核心概念,

才能写出高效OC代码。


【三、内存模型(memory model)——1.分配内存】

注意:理解C语言的内存模型(memory model),

有助于理解OC的内存模型及“引用计数”(Reference Counting)机制的工作原理。

前提:要理解内存模型,

需先明白OC的指针用来指示一个对象。

【例一】

要求:声明一个变量someString,

是NSString类型;

它指向堆上的某块内存,

该内存块中存放了一个NSString对象。

语句:NSString* someString =@"The string";

作用:该语法照搬了C语言的实现,

1.声明了一个变量someString,类型为NSString*。

即:变量someString是NSString类型的指针。

即:在当前栈中,分配了一块内存,

该内存大小可以放一个指针。

(32位计算机上是32位,即4字节;

64位计算机上,是8字节)。

2.令其指向某个对象。

这里,指向字符串@"The string”的地址,

即:栈中分配的内存空间,

存放了字符串@"The string”的首地址。

注意:OC的对象必须分配在“堆空间”(Heap Space),

绝对不允许分配在栈(Stack)上。

错误:NSString stackString;

分析:error: interface type cannot be statically allocated

【浅拷贝】

【例二】

要求:再创建一个变量,

令其指向变量someString的同一地址,

不拷贝该对象,

只是这两个变量会同时指向该对象:

语句:

NSString*someString = @"The string";

NSString*anotherString = someString;

注意:这时,只有一个NSString对象(实例),即:@"The string”。

但有两个变量指向该对象。

这两个变量都是NSString*型,

这说明当前“栈帧”(stack frame)里分配了两块内存,

每块内存的大小都能容下一枚指针

(在32位架构的计算机上是4字节,

64位计算机上是8字节)。

这两块内存里的值都一样,

就是NSString实例的内存地址。

图示:

图1-1描述了此时的内存布局。

存放在NSString实例中的数据,

含有代表字符串实际内容的字节。



【三、内存模型(memory model)——2.管理内存】

(1)内存管理原则:

1.堆中分配的内存,必须程序员直接管理;

2.栈上分配的内存,

会在其栈帧弹出时,由系统自动清理。

(2)OC的内存管理:“引用计数”(参见第29条)

OC将堆内存管理抽象出来了。

不需要调用malloc及free来分配或释放对象所占的内存空间。

OC运行时环境,采用的内存管理架构,

叫“引用计数”。

(3)OC中在栈空间存放的特殊对象

在OC代码中,可以定义不含*的变量,

它们可能会使用“栈空间”(stack space)。

这些变量,所保存的不是OC对象。

例如:CoreGraphics框架中的CGRect。

CGRect frame;

frame.origin.x = 0.0f;

frame.origin.y = 10.0f;

frame.size.width = 100.0f;

frame.size.height = 150.0f;

CGRect是C结构体,其定义是:

structCGRect{

CGPoint origin;

CGSize size;

};

typedef struct CGRect CGRect;

说明:

整个系统框架都使用这种结构体,

如果改用OC对象来处理,则会影响性能。

与创建结构体相比,

创建对象还需要额外开销,

如:分配及释放堆内存等。

如果只需保存int、float、double、char等

“非对象类型”(no nobject type),

则通常使用CGRect这种结构体就可以了。

建议读者先看C语言教程,

在熟悉其语法后,再开始学习编写OC代码。

否则,某些OC语法,也许会令你困惑。

【第一条——记住要点】

1.OC是C的超集。

C语言,是面向过程的语言。

OC语言,增加了面向对象特性。

OC,使用动态绑定的消息结构,

即:在运行时,才会检查对象类型。

接收一条消息之后,究竟应执行何种代码,

由运行期环境(而非编译器)来决定。

2.理解C语言的核心概念,

有助于写好Objective-C程序。

尤其要掌握内存模型与指针。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容