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. Android PopupWindow 弹窗背景半透明,设置最大高度

    首先讲一个网上的方法: popupwindow弹出后,屏幕背景变成半透明这个效果很普通.实现的方法也很多.我使用的可能是最简单的一种,就是设置一下getWindows的透明度. /** * 设置添加屏 ...

  2. 【Robot Framework】robot framework 学习以及selenium、appnium、requests实践(二)

    之前简单的介绍了如何使用RF,在这一节里,主要介绍下Selenium2Library的API, 在线的地址是http://robotframework.org/Selenium2Library/Sel ...

  3. some tips

    1.在使用selenium的时候,需要等待页面加载完成,特别是一些ajax请求,最好使用以下方法(python),通过document.readyState来判断 from selenium.webd ...

  4. 【CImg】三角形绘制算法实现

    这周的CV基础练习是简单的图形绘制:比如说矩形.三角形和圆心什么的.会发现其实矩形和圆形的实现思路都很直白,矩形只需要确认两个对角坐标就可以了,圆心只需要确认圆心和半径,接着就是简单的遍历各个像素点判 ...

  5. IT综合学习网站收集

    最近整理了一下曾经使用过的IT从入门到广泛的综合类基础学习网站,记录下来,以便初学者使用: 1.http://www.w3school.com.cn/  中文版基础在线学习平台 2.http://ww ...

  6. 慕课网-安卓工程师初养成-3-4 Java中的比较运算符

    来源:http://www.imooc.com/code/1299 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常 ...

  7. 是否连接VPN

    //需要导入ifadds头文件 //是否连接VPN - (BOOL)isVPNConnected{     struct ifaddrs *interfaces = NULL;     struct ...

  8. 视频运动motion vector获取。

    http://victor.csie.org/blog/archives/362------------------------------------------------------------ ...

  9. php获取文件创建时间、修改时间

    filemtime ( string filename ) 返回文件上次被修改的时间,出错时返回 FALSE.时间以 Unix 时间戳的方式返回,可用于 date(). 例如:$a=filemtime ...

  10. 2.1Android底层开发需要哪些工具

    开发.测试和调试Linux驱动.HAL程序库需要的工具: (1)JDK6或以上版本: (2)Eclipse3.4或以上版本: (3)ADT(用于开发Android应用程序): (4)CDT(用于开发A ...