【翻译+笔记】【高质量Objective-C-2】第1条:了解Objective-C语言的起源-Maoyingyong

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

  Effective Objective-C 2.0

   52 SpECifiC WayS tO imprOvE yOur iOS and OS X prOgramS

   matt galloway


本书是世界级C++开发大师Scott Meyers亲自担当顾问编辑的“Effective Software Development Series”系列丛书中的新作,Amazon全五星评价。

从语法、接口与API设计、内存管理、框架等7大方面总结和探讨了Objective-C编程中52个鲜为人知和容易被忽视的特性与陷阱。

爱飞翔先生翻译成了中文版《编写高质量iOS与OS X代码的52个有效方法》


我在阅读原文和中文译版,受益匪浅。

阅读过程中,加上自己的理解,总结整理成此系列笔记,方便自己复习,也方便分享给朋友们。


========================================================


======================================================
第1章 熟悉Objective-C
======================================================

======================================================
第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实例中的数据,含有代表字符串实际内容的字节。

page18image384

三、内存模型(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结构体,其定义是:
struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;

说明:
  整个系统框架都使用这种结构体,
  如果改用OC对象来处理,则会影响性能。
  与创建结构体相比,创建对象还需要额外开销,如:分配及释放堆内存等。
  如果只需保存int、float、double、char等“非对象类型”(nonobject type),
  则通常使用CGRect这种结构体就可以了。

建议读者先看C语言教程,在熟悉其语法后,再开始学习编写OC代码。
揉着,某些OC语法,也许会令你困惑。

【第一条——记住要点】
1.OC是C的超集。
  C语言,是面向过程的语言。
  OC语言,增加了面向对象特性。
  OC,使用动态绑定的消息结构,即:在运行时,才会检查对象类型。
         接收一条消息之后,究竟应执行何种代码,由运行期环境(而非编译器)来决定。

2.理解C语言的核心概念,有助于写好Objective-C程序。
  尤其要掌握内存模型与指针。

——笔记摘要 Maoyingyong


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值