浅谈Objective—C中的面向对象特性
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中的面向对象特性的更多相关文章
- 浅谈 Swift 2 中的 Objective-C 指针
浅谈 Swift 2 中的 Objective-C 指针 2015-09-07 499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 【sql注入】浅谈sql注入中的Post注入
[sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...
- 浅谈关于QT中Webkit内核浏览器
关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...
随机推荐
- dedecms首页怎么调用公司简介的内容
DeDeCMS功能虽然强大,但还是有些细节上的功能没有实现,正如本文描述的问题一样,DEDECMS要在网站首页调用公司简介的内容,而且还要截取前多少个字符数的时候,DEDECMS标签中没有能实现这样的 ...
- [ CodeVS冲杯之路 ] P1171
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入 ...
- 慕课网-安卓工程师初养成-4-12 Java循环跳转语句之 continue
来源:http://www.imooc.com/code/1432 continue 的作用是跳过循环体中剩余的语句执行下一次循环. 例如,打印 1--10 之间所有的偶数,使用 continue 语 ...
- 第4章 sed命令
1 sed命令基本用法 sed(stream editor)是流编辑器,可对文本文件和标准输入进行编辑: sed只是对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件,如果需要保存改动内容,可以选择 ...
- 09_platform-tools简介&常见adb指令
SDK下面的文件夹说明add-ons 附加的附属的一些信息.docs Android开发的帮助文件.extras 支持的jar包,高版本兼容底版本.google usb的驱动.platforms 存放 ...
- Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
首先,我们先看一下Collection集合的基本结构: 1.Collection接口 Collection是最基本集合接口,它定义了一组允许重复的对象.Collection接口派生了两个子接口Set和 ...
- office 2003和office 2013同时安装使用的问题
电脑上同时安装了Office 2003和Office 2007/2010,先打开Word 2003,然后再打开Word 2010,总会弹出安装配置界面,反之亦然. 解决方法:使用快捷键Win+R打开 ...
- Qt Meta Object System-元对象系统
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 元对象系统 ...
- C# Socket网络编程精华篇(转)
我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本 ...
- Groovy轻松入门——搭建Groovy开发环境
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...