Objective—C世界中的面向对象程序设计

面向对象称程序设计可能是现在最常用的程序设计模式。如何开发实际的程序是存在两个派系的——

  • 面向对象语言——在过去的几十年中,很多的面向对象语言被发明出来,包括Simula、Eiffel、和Smalltalk。
  • 面向对象添加(addition)——部分原因是让程序员学习一门全新的语言是一件比较困难的事情,因此很多混合语言被开发出来,其中包括C++ 、Java、Python、C#以及Objective—C。面向对象特性也被添加进来诸如PHP之类的语言,甚至是Fortran和Cobol也增加了面向对象的特性。

下面浅谈下Objective—C与诸如C++ 之类的语言之间的差异,其中最大的差异可能就在于其消息语法以及人们谈论这种消息语法的方式了。与其他面向对象语言一样,Objective—C也拥有类,类也可以拥有方法,但需要通过消息来与方法进行通信。一条消息会由方括号扩起来,由接收该消息的目标对象名和消息本身构成。

类的实现文件的后缀名是.m。之所以这样命名是因为实现被称为消息文件的,它包含在头文件(.h)中定义的消息代码(这可能可能并不是真实的原因,但在Objective—C中的消息的重要性是毋庸置疑的)。

1.简单的消息

下面是一条发送给myObject的对象的简单消息,当然这里假设对象的类型为NSObject——这个对象是Objective——C中大多数类层次的根类。

[myObject init];

这条消息是调用了myObject对象的init方法(这就是前面提及的很多人以不同的发式谈论Objective—C方法:他们通常会讲在一个对象上调用一条消息)。

方法可以返回一个值,如果一个方法返回一个值,那么可以使用下面的代码将其返回值献给一个局部变量:

myvariable = [myObject init];

2.声明方法

在Objectives—C中需要使用C函数语法的一个变体来声明方法。NSObjective是几乎所有的Objective—C的根类,它声明了一个init方法。

下面代码声明了前一节中用到的消息:

- (id)init

方法开头的减号是声明的重要部分:它是方法的类型,表明这个方法是为类的实例定义的、任何包含这个方法声明的类的实例都可以调用这个方法,换句话说,即使者可以向这个类的任何一个实例发送init方法。由于这个这个类是所有其他对象的超类NSObject,因此这意味着,可以向任意实例发送init消息。

3.使用类方法

方法声明开头的减号表明这是一个实例方法,在Objective—C中,还存有另一种类型的方法:类方法,它是由加号来指定的。

一条调用某个实例方法的消息可以被送给遵循该3特定类的约束的任意实例。在调用实例方法时需要使用类实例,而在调用类方法时则需要使用类本身,没有任何实例会参与这个过。

类方法最常见的用途是作为工厂方法使用,可能最常见类方法就是alloc了,在NSObject中,其声明如下所示。

+(id)alloc;

在向实例发送init消息时会使用下面这样的代码。

[myObject init];

而使用alloc分配类的实例时会使用下面这样代码。

[myClass alloc];

上面的代码会返回MyClass类的一个实例,从上面的声明中可以看出,这段代码返回的结果类型为id,因此现在是时候讨论一下这个类型了。

4.使用id——强和弱类型变量

Objective—C支持强类型变量和弱类型变量。当使用强类型引用一个变量时需要指定该变量的类型,变量的真实类型必须是要是所指定类型或类型的子类,如果指定的类型是一个子类,那么根据定义,该类型是所有其超类的类型。

在Cocoa中,像下面这样声明一个变量:

NSArray *myArray

意味着该为可以引用一个类型NSMutableArray的对象,因为NSMutableArray是NSArray的一个子类。在处理数组的元素时也可以采用同样的方法,而不用关心数组元素的实际类型。在某些情况下,可能还需要将某个实例的类型强制转换成其子类型(如果确实知道实例的子类型是什么的话)。

id是类型是最弱变量,它可以是任何任何一个类,这就是它在alloc方法中用作用返回类型的原因。alloc是NSObject中一个类方法,如果在NSArray上调用该方法的话会通过id返回一个实例,实际上它是一个NSArray实例。

5.嵌套消息

可以将消息嵌套进另一个消息。

myObject = [MyClass alloc];

myObject = [myObject  init]

上述代码使用MyClass的类方法来分配MyClass的一个实例并把该实例赋给myObject变量。

可以将上面的两条消息嵌套起来,

myObject = [[Myclass alloc] init];

嵌套方括号个规则与嵌套圆括号的规则是一样的。

6.方法签名和参数初探

alloc和init是两个最简单的方法,因为它们没有参数,不管采用何种语言来编写方法,大多数方法都是有参数的。例如,可以编写接受两个参数并返回这两个参数的乘积的area。

在其他语言中编写方法时一般都需要为每个参数制定一个类型和名称,在Objective—C中情况也是如此,但它还是增加了另一个维度:它为每个参数都打上了标签。

这种命名规则意味着代码的可读性将变得更强,但当方法的参数多于一个时程序员就需要花时间去理解参数的含义了,当方法没有参数时,消息本身是由接收者和方法的名称构成:

[myObject init];

如果方法接收一个参数,那么该参数将会跟在方法的后面,在消息中则需要将参数将会跟在方法名后面,在消息中则需要将参数签名加一个冒号。例如,NSSet中可以通过下面的代码使用一个NSArray来初始化一个集合。

mySet =[NSSet alloc];

mySet initWithArray :myArray;

方法的声明需要指定参数的名称(再方法的代码中会用到参数名)和类型。

-(id)initWithArray:(NSArray *)array;

第二个和后续的参数也是有标签的它们与第一个参数之间的差别在于第一个参数的标签实际上市方法名。以下是典型调用

[mySet: initwithArray: myArray copyItems:YES];

下面是声明:

-(id)initWithSet:(NSSet *)set copyItems(BOOL)flag

小结:

Objective—C的核心,是消息结构。消息不仅仅与其他语言所谓的函数调用不同,它也是一种构建软件的方式,

浅谈Objective—C中的面向对象特性的更多相关文章

  1. 浅谈 Swift 2 中的 Objective-C 指针

    浅谈 Swift 2 中的 Objective-C 指针 2015-09-07  499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...

  2. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  3. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  4. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  5. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  6. 转载 浅谈C/C++中的static和extern关键字

    浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T   static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...

  7. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  8. 【sql注入】浅谈sql注入中的Post注入

    [sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...

  9. 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...

随机推荐

  1. Linux下程序对拍_C++

    此博客需要付费才阅读,因为该博客实用性十分强,且十分容易理解 若需购买请联系博主,联系方式戳这 http://www.cnblogs.com/hadilo/p/5932395.html 主要介绍如何在 ...

  2. 关于java.lang.String理解中的一些难点

    最近温习java的一些基础知识,发现以往对String对象认识上的一些不足.特汇总如下,主要是帮助记忆,如能对其他朋友有些启发,不胜欣喜. String在JVM中内存驻留问题 JVM的常量区(Cons ...

  3. fastcgi(一)

    首先安装 fastcgi 开发包 ... #wget http://www.fastcgi.com/dist/fcgi-current.tar.gz #tar -zxvf fcgi-current.t ...

  4. noip2008 火柴棒等式

    P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录   题目描述 给你n根火柴棍,你可以拼出多 ...

  5. aspxgridView,Repeater增加自动序号列

    第一种方式,直接在Aspx页面GridView模板列中.这种的缺点是到第二页分页时又重新开始了. <asp:TemplateField HeaderText="序号" Ins ...

  6. CSS用border绘制三角形

    使用border绘制三角形的思路,就是border尺寸设置一个较大的值,元素自身的宽高设置为0,全部由边线占据,这样每边就会显示为四分之一块的三角形.这样不借助图片,可以直接绘制出三角形了. 一个栗子 ...

  7. VS2010插件及快捷键设置

    几个常用的Visual Studio插件,番茄助手以及如下的插件,具体作用可用通过Google自行获取. 安装番茄助手后,可用在源文件和头文件中快速切换.但为了更方便使用,建议设置快捷键. vs201 ...

  8. JS产生四位随机数的方法

    <script>var charactors="1234567890"; var value='',i; for(j=1;j<=4;j++){ i = parse ...

  9. C# 调用控制台程序,并获取输出写入文件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...

  10. 高效率的全组合算法(Java版实现)

    博客上看到的一个算法,用Java实现了一个 算法描述: 算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种. 当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法. 1表示在该位取 ...