Objective-C 笔记二 类、对象和方法
对象就是一个物件。面向对象的程序设计可以看成一个物件和你想对它做的事情。这与C语言不同,C语言通常称为过程性语言。在C语言中,通常是先考虑要做什么,然后才关注对象,这几乎总是与面相对象的思考过程相反。
在面向对象的用语中,(这里我们以汽车作为对象)你的汽车是汽车的一个实例。car就是类的名称,这个实例就是从该类创建的。因此,每制造一辆新汽车,就会创建汽车类的一个新实例,而且汽车的每个实例都称为一个对象。
对象 | 使用对象执行的操作 |
你的汽车 | 驾驶 |
加油 | |
洗车 | |
维修 |
每个实例或对象不仅包含从制造商那里获得的有关原始特性的信息,还包含它的当前特性,这些特性可以动态改变。当你驾驶汽车时,邮箱的油渐渐耗尽,汽车越来越脏,轮胎也逐渐磨损。
对象使用方法可以影响对象的状态。如果方法是“给汽车加油”,那么执行这个方法之后,汽车的邮箱会加满。这个方法影响了汽车邮箱的状态。
这里关键的概念是:对象是类的独特表示,每个对象都包含一些通常对该对象说是私有的信息。方法提供访问和改变这些数据的手段。
[ClassOrInstance method ];
在这条语句中左方括号后要紧跟类的名称或者该类的实例名称,它后面可以是一个或多个空格,空格后面是将要执行的方法。最后,使用右方括号和分号来终止。请求一个类或实例来执行某个操作时,就是在向它发送一条消息,消息的接收者称为接收者。因此,有另一种方式可以表示前面所描述的一般格式:
[ receiver message ];
回顾上一个列表,使用这个新语法为它所编写所有的方法。在此之前,你需要获得一辆新车,去制造厂购买一辆:
yourCar = [Car new]; get a new car //这书写的真详细,不就是new一个对象么!就是yourCar现在就是你的车,你可以用它引用汽车的实例。
有了新车就要有新车的方法,所以这个新方法可叫作制造厂方法,或者类方法:
[yourCar prep]; get it ready for first-time use
[yourCar drive]; drive your car
[yourCar wash]; wash your car
[yourCar getGas]; put gas in your car if you need it
[yourCar service]; service your car
[yourCar topDown]; if it's a convertible
[yourCar topUp];
currentMileage = [yourCar odometer];
最后一个示例显示的实例方法可返回信息,即当前行驶里程,这通过里程表(odometer)可看出来。我们将该信息存储在程序中的currentMileage变量内。
这里有一个将特定值作为方法参数的例子,与方法直接调用有所不同:
[yourCar setSpeed:55]; set the speed to 55 mph
你姐姐Sue可以对她自己的汽车实例使用相同的方法;
[suesCar drive];
[suesCar wash];
[suesCar getGas];
将同一个方法应用于不同的对象是面向对象程序设计背后的主要理念之一。
用于处理分数的Objective-C类
假设要编写一个处理分数的程序,可能需要处理加、减、乘、除等运算。创建了一个Fraction类:
1 // 2 // Fraction.h 3 // 4 // Created by on 15/11/13. 5 // Copyright © 2015年 . All rights reserved. 6 // interface 部分 7 8 #import <Foundation/Foundation.h> 9 10 @interface Fraction : NSObject 11 12 -(void) print; 13 -(void) setNumerator :(int) n; 14 -(void) setDenominator:(int) d; 15 -(int) numberator; 16 -(int) denominator; 17 18 @end
1 // 2 // Fraction.m 3 // HelloWorld 4 // 5 // Created by on 15/11/13. 6 // Copyright © 2015年 . All rights reserved. 7 // 8 9 #import "Fraction.h" 10 11 @implementation Fraction 12 { 13 int numberator; 14 int denominator; 15 } 16 -(void) print{ 17 NSLog(@"%i/%i",numberator,denominator); 18 } 19 -(void) setNumerator:(int)n{ 20 numberator = n; 21 } 22 -(void) setDenominator:(int)d{ 23 denominator = d; 24 } 25 -(int) numberator 26 { 27 return numberator; 28 } 29 -(int) denominator 30 { 31 return denominator; 32 } 33 @end 34 //----program 部分---- 35 #import <Foundation/Foundation.h> 36 int main (int argc,const char * argv[]) 37 { 38 @autoreleasepool { 39 Fraction *myFraction; 40 41 //创建一个分数实例 alloc分配空间 init初始化 42 myFraction = [[Fraction alloc] init]; 43 //myFraction = [myFraction init]; 44 45 46 //Fraction *fact = [[Fraction alloc] init]; 47 48 //设置分数为1/3 49 [myFraction setNumerator:1]; 50 [myFraction setDenominator:3]; 51 52 // [fact setDenominator:3]; 53 // [fact setNumerator:7]; 54 55 //使用打印方法显示分数 56 NSLog(@"The value of myFraction is: %i/%i",[myFraction numberator],[myFraction denominator]); 57 //[myFraction print]; 58 // 59 // NSLog(@"Second fraction is:"); 60 // [fact print]; 61 } 62 return 0; 63 }
@interface部分用于描述类和类的方法;@implementation部分用于描述数据(类对象的实力变量存储的数据),并实现在接口中声明方法的实例代码;program部分的程序代码实现了程序的预期目的。
@interface部分
一般格式类似于:
@interface NewClassName: ParentClassName
propertyAndMethodDeclarations;
@end
按照约定,类名一般以大写字母开头。
- 变量名的名称规则:名称必须以字母或下划线(_)开头,之后可以是任何(大写或者小写)字母、下划线或者0~9之间的数字组合。
- 有些名称不能用作于变量名,例如int。因为其用途对Objective-C编译器而言有特殊含义,这种用法称为保留名或保留字。(就是系统关键字)
- Objective-C中的大小写字母是有区别的,变量名sum、Sum和SUM均表示不同的变量。
类方法和实例方法
-(void) print;
开头的负号(-)通知Objective-C编译器,该方法是一个实例方法。此外,还有一个选择,就是正好(+),它表示类方法。类方法是对类本身执行某些操作的方法,例如,创建类的新实例。
1、返回值
-(int) currentAge;
声明新方法时,必须要告诉OC编译器该方法是否有返回值。括号里就是方法的返回值类型!该方法指定名为currentAge的实例方法将返回一个整型值。
例:double双精度值,void代表无返回类型。
2、方法的参数
-(void) setNumberator: (int) n;
这是一个无返回值类型的实例方法,int用于指明参数类型。就setNumberator来说,其参数名就是n。这个名称可以是任意的。
@implementation部分
@implementation部分包含声明在@interface部分的方法的实例代码,且需要指定存储在类对象中的数据类型。(就是接口类,和实现类)
@implementation部分的一般格式如下:
@implementation NewClassName
{
memberDeclarations;
}
methodDefinitions;
@end
memberDeclarations部分指定了哪种类型的数据将要存储到Fraction中,以及这些数据类型的名称。
program部分
program部分包含解决特定问题的代码,如果有必要,它可以跨越多个文件。其中必须在某个地方有一个名为main的函数,通常情况下,这是程序开始执行的地方。
Fraction *myFraction;
这一行表示myFraction是一个Fraction类型的对象。
myFraction = [[Fraction alloc] init];
alloc是allocate的缩写,因为要为新分数分配内存存储空间。
init方法用于初始化类的实例变量。注意,你正将init消息发送给myFraction。也就是说,要在这里初始化一个特殊的Fraction对象,因此,它没有发送给类,而是发送给了类的一个实例。
init方法也可以返回一个值,即被初始化的对象。将返回值存储到Fraction的变量myFraction中。
让我们重新回到Fraction *myFraction;
myFraction前的星号(*)表明myFraction是Fraction对象的引用(或指针)。变量myFraction实际上并不存储Fraction的数据,而是存储了一个引用(其实是内存地址),表明对象数据在内存中的位置。
好啦!其它的就是些设值方法(setter)和取值方法(getter),就不详细说明啦,应该很好理解的。