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. pytest学习笔记(二)

    继续文档的第二章 (一)pytest中可以在命令行中静态/动态添加option,这里没什么好讲的,略过... 这里面主要讲下如何试用skip/xfail,还有incremental(包含一些列的测试步 ...

  2. C语言之实现控制台光标随意移动

    原理引入windows.h,首先是要获得输入的东西,然后通过判断: 1.方向键:执行上下左右的移动功能 2:回车键:执行换行的功能. 3.普通键:输入功能. 终点就是要获取到屏幕上的坐标,当按下了方向 ...

  3. 【翻译】使用CSS3和jQuery制作跟随鼠标方位的Hover特效

    今天我们来学习如何通过CSS3的特性和jQuery来创建一个感知鼠标滑动方向的hover效果.当鼠标滑进的时候,遮罩层会从上次鼠标滑出的方向滑入,当鼠标滑出的时候,遮罩层会跟随鼠标,从鼠标滑出的方向滑 ...

  4. 慕课网-安卓工程师初养成-2-12 如何在Java中使用注释

    来源:http://www.imooc.com/code/1274 在编写程序时,经常需要添加一些注释,用以描述某段代码的作用. 一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 ...

  5. 【练习】sqlnet.ora

    在SQLNET.ora文件中设置以下参数可以实现IP访问限制: $ pwd/u01/app/oracle/product/10.2.0/db_1/network/admin$ vi sqlnet.or ...

  6. asp.net 播放flash

    注意3点: 1.路径,swf播放器对应的是当前页面的路径,flv视频对应的是swf播放器的路径2.路径中不能出现中文3.IIS设置,IIS站点属性中的HTTP头->MIME添加MIME影射关系, ...

  7. DB2日常维护——REORG TABLE命令优化数据库性能

    一个完整的日常维护规范可以帮助 DBA 理顺每天需要的操作,以便更好的监控和维护数据库,保证数据库的正常.安全.高效运行,防止一些错误重复发生. 由于DB2使用CBO作为数据库的优化器,数据库对象的状 ...

  8. JavaScript DOM编程艺术学习笔记(一)

    嗯,经过了一周的时间,今天终于将<JavaScript DOM编程艺术(第2版)>这本书看完了,感觉受益匪浅,我和作者及出版社等等都不认识,无意为他们做广告,不过本书确实值得一看,也值得推 ...

  9. C# 打印异常

    1. [代码]函数:将异常打印到LOG文件     跳至 [1] [2] [4] [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  10. 带Left Join的SQL语句的执行顺序

    基础的SQL执行顺序 SQL语句执行的时候是有一定顺序的.理解这个顺序对SQL的使用和学习有很大的帮助. 1.from 先选择一个表,或者说源头,构成一个结果集. 2.where 然后用where对结 ...