《Effective Objective-C 2.0》1、熟悉Objective-C

该系列是《Effective Objective-C 2.0——编写高质量iOS与OS X代码的52个有效方法》的读书笔记。

第一条:了解Objective-C语言的起源

同C++类似,Objective-C也是C语言进行面相对象化的扩展。二者存在一个根本性的区别:

  • C++是一种基于函数调用的语言,运行时执行的代码由编译器决定。某个对象试图调用哪一个函数将在编译过程中确定好。只有在实现了多态函数的前提下,运行时才会按照虚函数表动态查找实际调用的函数。
  • Objective-C是一种基于消息结构的语言,运行时所执行的代码由运行环境决定,在编译时并不会查找目标对象要执行的方法。编译器甚至不会实际关心接收消息的对象的类型,而是留到运行时由动态绑定进行处理。同C++相比,可以认为Objective-C永远都是多态的。

也正是因为这种原因,Objective-C语言所有的重要工作都由运行时组件而非编译器来实现,该组件包含了所有Objective-C面向对象特性所需的数据结构和函数。举例说明,Objective-C编写的应用大多运行在iOS操作系统上,Objective-C的运行时组件可以认为是属于iOS的一部分。在查阅Objective-C文档时我们也经常发现,某个类某个方法的有效范围通常是给定的某几个iOS的版本(如iOS 6.0以后、iOS 3.0~6.0等),而不是XCode 4.5、XCode 5.1等编译工具的版本。这也说明Objective-C的函数更多的与iOS系统的版本相关联而非IDE。

在Objective-C中,所有的对象都分配在堆空间中,不会直接分配在栈空间。对象创建后将对象的地址返回一个指针用于对对象进行操作。另外有一些类比较特殊,已CGRect等为例,该类直接定义在栈中,已实力的形式存在而不是只想对象的指针。因为CGRect等类实际上是C的结构体,而且结构较为简单。采用这种方式有助于提升系统的性能。

第二条:尽量避免类的头文件中引入其他头文件

我们知道,在工程中新建一个Objective-C类,会添加头文件(.h)和源文件(.m)两个文件。头文件中声明类的公有成员和API接口,源文件中实现类的方法。如果需要暴露的接口参数或公有成员为某一个Objective-C类,那么可以使用前向声明而非引入另一个类的头文件的方式解决:

@class SomeClassName;

如果直接引入头文件,那么头文件所暴露给使用者的内容就会过多(尤其是连续很多级import之后),可能造成编译时间较长。使用前向声明则很好地解决了这个问题,减少了类的使用者的头文件的数量。而且解决了循环import可能造成的无法正确编译的问题。

有时候必须在头文件中包含其他头文件,主要有两种情况,其一是该类继承自其他某个类,另一种情况是当前类复合某种协议,协议的定义应单独放置于一个头文件中。而在代理(delegate)方法中,不需要添加独立的头文件。代理方法与实现代理的类写在同一个文件中。

时间: 2024-11-01 01:08:00

《Effective Objective-C 2.0》1、熟悉Objective-C的相关文章

Eero 2011-07-20发布 二进制Objective C 2.0兼容变体

Eero 2011-07-20版本增加了一个新的"pass message" 操作符,由冒号表示.变更了信息链接的语法. 同时提升了":=" 操作符,并且支持对象的实体变量. Eero 是一个二进制兼容的 Objective C 2.0 的变体,其目的是为了让代码编写更加简单,提升代码的可读性.Eero 实现了补丁版的 Clang/LLVM 编译器.Eero 使用类 Python 的代码缩进以及操作符重载限制.该语言主要从 Smalltalk 和 http://ww

Eero 2011-09-01发布 二进制Objective C 2.0变体

Eero 2011-09-01是第一个beta版本的发布.引入新的嵌套函数,添加为NSRanges句法支持. Eero是一个二进制兼容的Objective C 2.0 的变体,实现了补丁版的Clang/LLVM编译器.其特点5649.html">是为了让代码编写更加简单,降低了代码的混乱,提升代码的可读性.Eero使用类Python的代码缩进以及操作符重载限制.该语言主要从Smalltalk 和 http://www.aliyun.com/zixun/aggregation/13430.h

Eero 2011-08-15发布 二进制Objective C 2.0变体

Eero 2011-08-15该版本方括号不再使用的消息传递.消息代码被重构. Eero 是一个二进制兼容的Objective C 2.0 的变体,实现了补丁版的Clang/LLVM编译器.其特点5649.html">是为了让代码编写更加简单,降低了代码的混乱,提升代码的可读性.Eero 使用类 Python 的代码缩进以及操作符重载限制.该语言主要从 Smalltalk 和 http://www.aliyun.com/zixun/aggregation/13430.html"&

Eero 2011-08-02发布 二进制Objective C 2.0 的变体

Eero 2011-08-02版本引入了Compact blocks. 详细信息:http://eerolanguage.org/ Eero 是一个二进制兼容的Objective C 2.0 的变体,实现了补丁版的Clang/LLVM编译器.其特点是为了让代码编写更加简单,降低了代码的混乱,提升代码的可读性.Eero 使用类 Python 的代码缩进以及操作符重载限制.该语言主要从 Smalltalk 和 Ruby 中获得灵感. 下载地址:http://eerolanguage.org/wp-c

Eero 2011-07-24发布 二进制Objective C 2.0变体

Eero 2011-07-24该版本强调数值文字是被充许的. Eero 是一个二进制兼容的 Objective C 2.0 的变体,其目的是为了让代码编写更加简单,提升代码的可读性.Eero 实现了补丁版的 Clang/LLVM 编译器.Eero 使用类 Python 的代码缩进以及操作符重载限制.该语言主要从 Smalltalk 和 http://www.aliyun.com/zixun/aggregation/13430.html">Ruby 中获得灵感. 下载地址:http://ee

Eero 2011-06-25发布 二进制兼容Objective C 2.0变种

Eero 是一个二进制兼容的 Objective C 2.0 的变种,其目的是为了让代码编写更加简单,提升代码的可读性.Eero 实现了补丁版的 Clang/LLVM 编译器.Eero 使用类 Python 的代码缩进以及操作符重载限制.该语言主要从 Smalltalk 和 http://www.aliyun.com/zixun/aggregation/13430.html">Ruby 中获得灵感. Eero 2011-06-25支持增加了对选择和协议"文本"对象和类转

AS3.0实例学习 熟悉新的事件机制和addChild的运用_Flash As

首先声明:本人大菜鸟一个,刚接触AS3不久,许多理念还没来得及灌输,这些case都是从网上down的,但因为解说是英文的,不利我们学习,我就充当一个translater,顺便可以让自己巩固一下知识. 水平有限,错误难免,欢迎大虾小虾,大鸟小鸟指正. 下面进入正题: 案例1:熟悉新的事件机制和addChild的运用 说明:拖动小人到滑板上,然后拖动滑板,可以发现小人已经跟滑板粘在了一起. 演示:http://www.live-my-life-with-yuyi.com/as3_cases/chan

AS3.0 实例学习 熟悉AS3的package,以及多个package之间的相互通信_Flash As

熟悉AS3的package,以及多个package之间的相互通信 说明:一个很简单的demo,有4个按钮,当鼠标划过和移开时会呈现出不同的状态,单击后变成disabled,再点击其他的按钮时,之前disabled的按钮恢复,被点击的按钮失效. 演示:http://www.live-my-life-with-yuyi.com/as3_cases/communicating/ 准备工作:打开源文件communicating_final.fla,点击属性里的发布设置,点击Actionscript3旁边

AS3.0实例学习 熟悉xml的运用_Flash As

案例4:熟悉xml的运用 说明:一个简单的相册,先载入xml,然后载入xml列表里的images缩略图,点击缩略图出现大图以及大图的说明.这个案例较前面几个复杂了一些,不过如果熟悉了AS3的语法,还是比较容易理解的. 演示:http://www.live-my-life-with-yuyi.com/as3_cases/gallery_tween/ 代码: 复制代码 代码如下: import fl.transitions.Tween;  import fl.transitions.easing.*

AS3.0 实例学习 熟悉addChild和removeChild在不同的swf之间的运用,以及loader的用法_Flash As

案例2:熟悉addChild和removeChild在不同的swf之间的运用,以及loader的用法 说明:点击picture会载入另一个swf,点击载入的swf上的一个按钮,该swf消失. 演示:http://www.live-my-life-with-yuyi.com/as3_cases/different_movies/ 代码: swfA(也就是按钮所在的flash) 复制代码 代码如下: var loader:Loader = new Loader();  loader.load(new