- 浏览: 1756835 次
- 性别:
- 来自: 大连
博客专栏
-
Spring数据库访问系列...
浏览量:173650
-
Android学习笔记
浏览量:368109
-
iBatis开发详解
浏览量:189254
-
Objective-C学习...
浏览量:99828
最新评论
-
iLidy:
引用[/c
Hibernate持久化对象的生命周期详解 -
fengzigogo:
您好,有这个项目架构的源码下载地址吗?
一种Java Web应用开发框架的构建(基于Struts2+Spring+FreeMarker)之一 -
spring_springmvc:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
用Maven构建Java Web开发环境(Jetty容器)之二 -
springdata_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
Spring 3之MVC & Security简单整合开发(二) -
赵庆辉:
看帖回复是美德,楼主讲的很清晰明了,看了豁然开朗.
Java String对象的经典问题(new String())
接上文
从字面来理解Objective-C就是对象化的C,那么也就是说O-C是对C的扩展,加入了对象的概念。当然C++也是有对象概念的,只是两者的编译环境有所不同。
面向对象的概念不是针对某一种编程语言而言的,它是一种程序设计思想。最基本的面向对象包括了类,对象和方法这三个概念。举日常生活中的例子,比如10路公交车,10路有几十辆车,每一辆车都是一个对象,10路并不是拥有任意一辆车,而是分配给它的特定的车。每一辆车都会有一个编号,这在公交系统中是唯一的。
那么在面向对象术语中,10路的任意一辆车都是公交车的一个实例。定义Vehicle为汽车类的类名,那么一辆车就是从该类创建的。每制造一辆车,都会创建汽车类的一个新的实例,而汽车的每个实例都称为一个对象。
不同车辆的型号不同,那么会有不同的属性,比如载客量,功率等。而使用车辆执行特定的操作,比如:加油,起步,到站,(可能还会有)检修,清洗等。这些操作可以对任意一辆车进行操作。这些对实例的操作称为方法。
如果想知道该车一共生产了多少辆,那么这个方法是适用在类上的,所以叫类方法。而想知道每辆车的行驶总里程或者当前油量,那么不同的车会有不同的数值,这个方法就是实例方法。
下面来应用具体的语法来看看Objective-C中的类,分数是一个数学概念,包含两个部分(分子和分母),我们知道了如何定义变量,那么使用变量,我们可以这么来表示一个分数:
这里只是用于显示,并没有考虑分母为0的情况,当然这么写就是分母为0也不会有问题,因为代码中并没有真实的分数计算。我们运行代码,就会得到输出:
下面我们编写一个Fraction类来表示分数,在项目Prog1上点击右键,选择New File,然后看到如下图所示窗口:
选择Objective-C class类型,点击Next继续:
给我们的分数类起个名字Fraction,类型已经为我们选好了,就是NSObject类型,点击Next继续:
选择一个位置,我们将这个类保存在Prog1下,直接点击Create创建即可,得到如下图所示的两个文件:
Fraction.h是头文件,Fraction.m是Objective-C的类文件,在头文件中,我们需要编写@interface部分,代码如下:
可以先不管这些代码的具体含义,之后在Fraction.m文件中编写类的实现和主函数,代码如下:
代码已经写完,下面先运行出效果看看。这里注意我们在一个项目中不能有两个主函数的定义存在,那么要把之前main.m文件删除,确保运行没有问题,我们点击Run,就会得到如下输出:
代码运行没有问题,我们来看看这两个文件中的代码都是什么意思。
先看头文件,这中间#import <Foundation/Foundation.h>很好理解,就是导入系统类。之后的@interface Fraction : NSObject ... @end是类的定义部分。以@interface开始,后面跟着类名,冒号后面是父类的名称,说明我们的类是继承自NSObject的,关于继承的概念这里先不说。那么中间的代码就是类中方法/类属性定义了。
关于类名的命名规则,方法名的命名规范,这里就不再多说,我们按照习惯和约定来编写即可。首先对于一个方法,开始为负号(-),这是告诉Objective-C的编译器,该方法是一个实例方法,如果是正号(+),那么该方法就是类方法,注意和UML中的+/-区分,这里的+/-不表示访问控制。
紧跟正负号后面的是方法返回值,这里我们定义的三个方法都是(void),无返回值类型的。那么这里可以使用(int)作为整型返回值,(double)作为双精度浮点型返回值。返回值定义后面的就是方法名,如果该方法没有参数,直接分号结束即可,比如-(void) print;
如果方法接受参数,那么在方法名后面加上冒号,冒号之后是参数定义,也是(参数类型) 参数名称的格式,比如(int) m。那么我们在头文件中编写的所有代码的含义就都明白了。
下面来看.m文件,首先是#import "Fraction.h",表示导入我们定义的头文件,而头文件中已经导入了Foundation.h,那么这里也会自动导入Foundation.h。
@implementation Fraction ... @end是实现部分。格式就是@implementation后跟着类名,以@end结束。
在@interface部分我们没有定义属性,因为本例中的变量都是成员变量而不是类属性,一组大括号中放置的是实例变量定义,比如本例的
之后是对方法的实现,方法声明后的一对儿大括号内就是具体的方法实现代码,本例中对print方法的实现就是调用系统的NSLog函数,而setNumerator和setDenominator方法就是赋值操作。
最后是主函数部分,就是我们的具体业务代码实现,Fraction *myFraction;表示声明一个引用(指针)变量myFraction,其类型是Fraction。有了引用,要创建一个分数,可以使用myFraction=[Fraction alloc];来完成,alloc是allocate的简写,表示为新的对象分配内存空间,这个写法就是告诉Fraction类要执行alloc方法,现在这个方法我们没有定义,那就是系统类库提供的。
使用alloc分配空间后,紧接着是[myFraction init];这要对我们的myFraction变量进行初始化。同理,init也是系统提供的初始化方法。和alloc方法一起,可以看做Java中的new Fraction()来生成一个Fraction对象,其实这里使用new方法来合并alloc方法和init方法也是可以的,写为Fraction *myFraction = [Fraction new]。
以上两个语句可以合并为
之后的[myFraction setNumerator:1];是告诉myFraction调用setNumerator方法,并且提供了一个变量1作为参数。同理[myFraction setDenominator:3];就好理解了。之后的NSLog代码不再解释,最后的[myFraction print];就是调用myFraction的print方法来打印Log了。
这里没有release操作,因为我们使用的XCode版本高于4.2,系统会默认开启ARC机制,自动释放内存。
下面来看使用多个分数的示例(主函数部分如下,其余内容和之前相同):
运行程序,得到如下输出:
说明我们程序的编写是没有问题的。回过头来看Fraction *frac1=[[Fraction alloc] init];这说明我们声明了一个指针类型的引用变量*frac1,创建的对象是Fraction,在alloc后内存中创建出该对象并返回内存地址给指针变量*frac1,申请完空间需要对对象进行初始化,所以就用到了init方法。
从本例中可以看出,每创建一个新对象时,它都会有自己的一组实例变量。上面我们给出的是为实例变量复制的set方法,但如果想通过对象引用来访问实例变量,在O-C中却做不到,此时我们需要编写新的方法来获取实例变量的值,这里就涉及到了“数据封装”这个概念。这个机制使得定义类的人不用担心使用类的人会不会破坏类的结构,他们完全被隔离了。
那么我们需要编写新的方法来获取实例变量的值,修改头文件如下:
也就是在类的定义中加入了两个方法,其返回值都是int,根据方法名我们可以看出这是要分别获取numerator和denominator的值。那么方法的实现为:
当然方法的实现也是很简单的,就是返回这个变量的值即可,那么我们继续修改程序如下所示(主函数部分如下,其余内容和之前相同):
我们运行程序,就会得到如下输出:
这里在NSLog的参数列表中,我们使用了numerator方法和denominator方法来分别获取各自的值。
接下文
从字面来理解Objective-C就是对象化的C,那么也就是说O-C是对C的扩展,加入了对象的概念。当然C++也是有对象概念的,只是两者的编译环境有所不同。
面向对象的概念不是针对某一种编程语言而言的,它是一种程序设计思想。最基本的面向对象包括了类,对象和方法这三个概念。举日常生活中的例子,比如10路公交车,10路有几十辆车,每一辆车都是一个对象,10路并不是拥有任意一辆车,而是分配给它的特定的车。每一辆车都会有一个编号,这在公交系统中是唯一的。
那么在面向对象术语中,10路的任意一辆车都是公交车的一个实例。定义Vehicle为汽车类的类名,那么一辆车就是从该类创建的。每制造一辆车,都会创建汽车类的一个新的实例,而汽车的每个实例都称为一个对象。
不同车辆的型号不同,那么会有不同的属性,比如载客量,功率等。而使用车辆执行特定的操作,比如:加油,起步,到站,(可能还会有)检修,清洗等。这些操作可以对任意一辆车进行操作。这些对实例的操作称为方法。
如果想知道该车一共生产了多少辆,那么这个方法是适用在类上的,所以叫类方法。而想知道每辆车的行驶总里程或者当前油量,那么不同的车会有不同的数值,这个方法就是实例方法。
下面来应用具体的语法来看看Objective-C中的类,分数是一个数学概念,包含两个部分(分子和分母),我们知道了如何定义变量,那么使用变量,我们可以这么来表示一个分数:
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { int numerator=1; int denominator=3; NSLog(@"The fraction is %i/%i",numerator,denominator); } return 0; }
这里只是用于显示,并没有考虑分母为0的情况,当然这么写就是分母为0也不会有问题,因为代码中并没有真实的分数计算。我们运行代码,就会得到输出:
下面我们编写一个Fraction类来表示分数,在项目Prog1上点击右键,选择New File,然后看到如下图所示窗口:
选择Objective-C class类型,点击Next继续:
给我们的分数类起个名字Fraction,类型已经为我们选好了,就是NSObject类型,点击Next继续:
选择一个位置,我们将这个类保存在Prog1下,直接点击Create创建即可,得到如下图所示的两个文件:
Fraction.h是头文件,Fraction.m是Objective-C的类文件,在头文件中,我们需要编写@interface部分,代码如下:
// // Fraction.h // Prog1 // // Created by Nan Lei on 12-12-25. // Copyright (c) 2012年 Nan Lei. All rights reserved. // #import <Foundation/Foundation.h> @interface Fraction : NSObject -(void) print; -(void) setNumerator: (int) n; -(void) setDenominator: (int) d; @end
可以先不管这些代码的具体含义,之后在Fraction.m文件中编写类的实现和主函数,代码如下:
// // Fraction.m // Prog1 // // Created by Nan Lei on 12-12-25. // Copyright (c) 2012年 Nan Lei. All rights reserved. // #import "Fraction.h" @implementation Fraction { int numerator; int denominator; } -(void) print { NSLog(@"%i/%i",numerator,denominator); } -(void) setNumerator:(int)n { numerator=n; } -(void) setDenominator:(int)d { denominator=d; } @end int main(int argc, const char * argv[]) { @autoreleasepool { Fraction *myFraction; myFraction=[Fraction alloc]; myFraction=[myFraction init]; [myFraction setNumerator:1]; [myFraction setDenominator:3]; NSLog(@"The value of myFraction is: "); [myFraction print]; } return 0; }
代码已经写完,下面先运行出效果看看。这里注意我们在一个项目中不能有两个主函数的定义存在,那么要把之前main.m文件删除,确保运行没有问题,我们点击Run,就会得到如下输出:
代码运行没有问题,我们来看看这两个文件中的代码都是什么意思。
先看头文件,这中间#import <Foundation/Foundation.h>很好理解,就是导入系统类。之后的@interface Fraction : NSObject ... @end是类的定义部分。以@interface开始,后面跟着类名,冒号后面是父类的名称,说明我们的类是继承自NSObject的,关于继承的概念这里先不说。那么中间的代码就是类中方法/类属性定义了。
关于类名的命名规则,方法名的命名规范,这里就不再多说,我们按照习惯和约定来编写即可。首先对于一个方法,开始为负号(-),这是告诉Objective-C的编译器,该方法是一个实例方法,如果是正号(+),那么该方法就是类方法,注意和UML中的+/-区分,这里的+/-不表示访问控制。
紧跟正负号后面的是方法返回值,这里我们定义的三个方法都是(void),无返回值类型的。那么这里可以使用(int)作为整型返回值,(double)作为双精度浮点型返回值。返回值定义后面的就是方法名,如果该方法没有参数,直接分号结束即可,比如-(void) print;
如果方法接受参数,那么在方法名后面加上冒号,冒号之后是参数定义,也是(参数类型) 参数名称的格式,比如(int) m。那么我们在头文件中编写的所有代码的含义就都明白了。
下面来看.m文件,首先是#import "Fraction.h",表示导入我们定义的头文件,而头文件中已经导入了Foundation.h,那么这里也会自动导入Foundation.h。
@implementation Fraction ... @end是实现部分。格式就是@implementation后跟着类名,以@end结束。
在@interface部分我们没有定义属性,因为本例中的变量都是成员变量而不是类属性,一组大括号中放置的是实例变量定义,比如本例的
{ int numerator; int denominator; }
之后是对方法的实现,方法声明后的一对儿大括号内就是具体的方法实现代码,本例中对print方法的实现就是调用系统的NSLog函数,而setNumerator和setDenominator方法就是赋值操作。
最后是主函数部分,就是我们的具体业务代码实现,Fraction *myFraction;表示声明一个引用(指针)变量myFraction,其类型是Fraction。有了引用,要创建一个分数,可以使用myFraction=[Fraction alloc];来完成,alloc是allocate的简写,表示为新的对象分配内存空间,这个写法就是告诉Fraction类要执行alloc方法,现在这个方法我们没有定义,那就是系统类库提供的。
使用alloc分配空间后,紧接着是[myFraction init];这要对我们的myFraction变量进行初始化。同理,init也是系统提供的初始化方法。和alloc方法一起,可以看做Java中的new Fraction()来生成一个Fraction对象,其实这里使用new方法来合并alloc方法和init方法也是可以的,写为Fraction *myFraction = [Fraction new]。
以上两个语句可以合并为
Fraction *myFraction=[[Fraction alloc] init];来写,这是O-C编程中比较常见的语句。
之后的[myFraction setNumerator:1];是告诉myFraction调用setNumerator方法,并且提供了一个变量1作为参数。同理[myFraction setDenominator:3];就好理解了。之后的NSLog代码不再解释,最后的[myFraction print];就是调用myFraction的print方法来打印Log了。
这里没有release操作,因为我们使用的XCode版本高于4.2,系统会默认开启ARC机制,自动释放内存。
下面来看使用多个分数的示例(主函数部分如下,其余内容和之前相同):
int main(int argc, const char * argv[]) { @autoreleasepool { Fraction *frac1=[[Fraction alloc] init]; Fraction *frac2=[[Fraction alloc] init]; [frac1 setNumerator:1]; [frac1 setDenominator:3]; [frac2 setNumerator:1]; [frac2 setDenominator:5]; NSLog(@"First fraction is: "); [frac1 print]; NSLog(@"Second fraction is: "); [frac2 print]; } return 0; }
运行程序,得到如下输出:
说明我们程序的编写是没有问题的。回过头来看Fraction *frac1=[[Fraction alloc] init];这说明我们声明了一个指针类型的引用变量*frac1,创建的对象是Fraction,在alloc后内存中创建出该对象并返回内存地址给指针变量*frac1,申请完空间需要对对象进行初始化,所以就用到了init方法。
从本例中可以看出,每创建一个新对象时,它都会有自己的一组实例变量。上面我们给出的是为实例变量复制的set方法,但如果想通过对象引用来访问实例变量,在O-C中却做不到,此时我们需要编写新的方法来获取实例变量的值,这里就涉及到了“数据封装”这个概念。这个机制使得定义类的人不用担心使用类的人会不会破坏类的结构,他们完全被隔离了。
那么我们需要编写新的方法来获取实例变量的值,修改头文件如下:
#import <Foundation/Foundation.h> @interface Fraction : NSObject -(void) print; -(void) setNumerator: (int) n; -(void) setDenominator: (int) d; -(int) numerator; -(int) denominator; @end
也就是在类的定义中加入了两个方法,其返回值都是int,根据方法名我们可以看出这是要分别获取numerator和denominator的值。那么方法的实现为:
-(int) numerator { return numerator; } -(int) denominator { return denominator; }
当然方法的实现也是很简单的,就是返回这个变量的值即可,那么我们继续修改程序如下所示(主函数部分如下,其余内容和之前相同):
int main(int argc, const char * argv[]) { @autoreleasepool { Fraction *myFraction=[[Fraction alloc] init]; [myFraction setNumerator:1]; [myFraction setDenominator:3]; NSLog(@"The value of myFraction is %i/%i",[myFraction numerator],[myFraction denominator]); } return 0; }
我们运行程序,就会得到如下输出:
这里在NSLog的参数列表中,我们使用了numerator方法和denominator方法来分别获取各自的值。
接下文
发表评论
-
Objective-C学习笔记12:高级数据类型一
2013-03-03 21:52 5067接上文 之前介绍过变量和数据类型,那么我们来看 ... -
Objective-C学习笔记11:多态和动态类型
2013-03-03 11:20 8907接上文 多态是一个典型的面向对象概念。Obje ... -
Objective-C学习笔记十:继承二
2013-03-02 21:27 4826接上文 之前 ... -
Objective-C学习笔记九:继承一
2013-01-12 20:32 15105接上文 继承是面向对象的一个核心概念。在Obj ... -
Objective-C学习笔记八:类的定义二
2013-01-06 11:00 5370接上文 我们继续来扩展分数类Fraction, ... -
Android学习笔记17:中级视图组件DatePicker和TimePicker
2013-01-05 12:08 16237接上文 HTML5出现之前,我们在Wweb开发 ... -
Objective-C学习笔记七:类的定义一
2013-01-05 10:53 8703接上文 我们还是结合之前分数的示例来说明,只是 ... -
Objective-C学习笔记六:选择结构二
2013-01-03 20:24 5626接上文 之前介绍的都是独立的if选择结构,其实 ... -
Objective-C学习笔记五:选择结构一
2013-01-02 21:37 5747接上文 选择结构,或者称为分支结构,是编程语言 ... -
Android学习笔记16:布局管理器的嵌套
2012-12-31 12:29 9720接上文 布局管理器的嵌套就是将多种布局管理器混 ... -
Objective-C学习笔记四:循环结构
2012-12-31 11:07 8674接上文 ... -
Android学习笔记15:绝对布局管理器AbsoluteLayout
2012-12-29 12:13 11506接上文 有相对布局管理器,对应的,我们还有绝对 ... -
Objective-C学习笔记三:基本数据类型和表达式
2012-12-29 12:06 10185接上文 任何编程语言都会有数据类型,比如在Ja ... -
Android学习笔记14:相对布局管理器RelativeLayout
2012-12-28 13:25 14797接上文 相对 ... -
Objective-C学习笔记一:第一个应用程序
2012-12-27 12:17 14434iOS程序是基于Object ... -
Android学习笔记13:表格布局管理器TableLayout
2012-12-27 11:54 19043接上文 在Web开发中,我们会接触到形形色色的 ... -
Android学习笔记12:框架布局管理器FrameLayout
2012-10-10 10:09 19933接上文 框架布局管理器是Android布局管理 ... -
Android学习笔记11:线性布局管理器LinearLayout
2012-10-02 13:51 15846接上文 和Java GUI部分的概念类似,布局 ... -
Android学习笔记十:基本视图组件:ImageView和ImageButton
2012-09-08 14:05 21657接上文 在Web ... -
Android学习笔记九:基本视图组件:Spinner
2012-09-02 19:58 50197接上文 在Web开 ...
相关推荐
Objective-C是一种面向对象的编程语言,由Smalltalk和C语言发展而来。它在20世纪80年代初被设计出来,并在苹果公司开发iOS和macOS应用程序时得到了广泛应用。Objective-C的主要特点在于其动态特性、消息传递机制以及...
1. Objective-C概述,介绍了Objective-C的来源、发展历史和作为面向对象的C语言的特点。 2. 第一个OC程序,讲解了如何创建一个OC项目,解释了一些OC程序中的关键字和语法。 3. OC基础语法,对比了OC和C语言的一些区别...
Objective-C是一种通用、面向对象的编程语言,它是在标准C的基础上进行扩展的。Objective-C主要用于开发macOS和iOS的应用程序,也是苹果官方推荐用于iOS开发的主要语言之一,尽管近年来Swift语言逐渐兴起。 #### 二...
```objective-c @interface Brand : NSObject // 品牌相关的属性和方法 @end @interface Lenovo : Brand // 具体的品牌属性和方法 @end @interface Apple : Brand // 具体的品牌属性和方法 @end @interface CPU :...
Objective-C(简称OC)是苹果公司为iOS和Mac OS X操作系统开发的一种面向对象的编程语言。它是C语言的超集,融入了Smalltalk的特性,使得它在编程时具有高度的灵活性和强大的表达能力。本笔记合集将深入探讨OC的基础...
### iOS开发教程(大神原创笔记)核心知识点详解 #### 一、Unix相关知识点 ...通过以上知识点的学习,开发者能够更好地理解和掌握Objective-C的基本语法和面向对象编程的概念,为后续的iOS应用开发打下坚实的基础。
3. Objective-C编程语言概述:Objective-C是在C语言基础上增加面向对象语法的语言。OC代码中可以混入C语言代码,文件后缀名为.m,支持C++代码的引入,后缀名改为.mm。OC的关键字以@开头,字符串也以@开头,使用NSLog...
- **面向对象编程**:需要具备面向对象编程的基础知识,如理解对象、循环和变量的概念。 - **Objective-C语言**:SDK中的Cocoa Touch主要使用Objective-C 2.0编程语言。即使不熟悉Objective-C的新特性,教程也会详细...
- **Objective-C**:在C语言基础上增加了面向对象特性,主要应用于Apple的iOS和Mac OS X系统开发。 - **Python**:作为一种解释型、面向对象的脚本语言,Python以其简洁的语法和强大的库支持在数据处理、Web开发和...
Objective-C是C语言的超集,它引入了Smalltalk的面向对象特性,如消息传递、类别(Category)、协议(Protocol)等。在iOS开发中,它提供了UIKit框架,该框架包含了许多用于创建用户界面和处理用户交互的类。`@...
Swift支持函数式编程、面向对象编程和命令式编程等多种编程范式,使得代码更易读、更易维护。 回到"MadBoards"项目,由于项目名称包含"木板",我们可以推测这可能是一款与教育、笔记或创意设计相关的应用。在iOS或...