1.什么是对象?
假如你拥有一辆卡宴车,显然他是一个对象,而且是你拥有它。在面向对象的属于中,“汽车” 是一个类, 显然你的卡宴这个对象是属于 汽车 这个类中, 所以你的卡宴就是汽车这个类的一个实例。 你的汽车是红色, 是跑车,排气量等特点,这些都是汽车本身的属性,也即类的属性,类的属性在类的定义中以成员变量来表示。你的汽车要加油,要跑,这些动作可以方法的形式实现。所以,类的独特存在就是一个实例,对实例的执行操作称为方法。
OC中类和对象调用方法的方式:
[ClassORInstance Method]; ----> 左边是类或是类的实例变量,右边是要执行的方法。
综上:
拥有相同(或相似)属性和行为i对象都可以抽象出一个类。
a. 创建对象,必须要先有类;
b. OC利用类来创建对象,对象是类的具体存在;
c. 解决问题的方法 (类/对象)-----> 方法;
2.类的实现
类的实现主要分三部分:
- @interface 部分 --> 用于描述类和类的方法以及描述(类对象的实例变量存储的数据);
- @implementation 部分 --> 实现接口中声明的方法的实际代码;
- program 部分 --> 实现程序的预期目的;
如下以处理分数的实现为例子:
(1)@interface 部分
类名称要标准化,首先要满足语言对标示符命名的要求, 其次名称要具有自解释性。
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
{
int Numerator;
int Denominator;
}
-(void) print;
-(void) setNumerator: (int)n;
-(void) setDenominator: (int)d;
@end
如上:
a. 类的名称为 Fraction (类名要以大写字母开头); 冒号后面跟着
父类:
NSObject (NSOject 是
基类,在NSObject.h中定义, 包含在
Foundation.h文件中, 即首句#import的作用);两个大括号中是成员变量的声明,
每创建新对象时,同时创建一组新的实例变量。
b. 因为不能直接访问分数的实例变量,故需要编写对实例变量赋值的set 方法, print 方法用来显示分数的值。
上面的三个方法声明中: "-" 表示是对象方法(“+” 表示类方法:类方法不依赖于对象,执行效率高,但是不能访问实例变量,如创建类的新实例)。
c. 返回值: (void) : 跟在“-”/"+" 后面的小括号里是方法的返回值类型,如:-(int)CutLength; 返回整形。在方法的实现时要有return 语句,如果无返回值,则用void。
d. 方法参数:方法名称后面加一个冒号,代表后面接参数。上面的set 方法都有一个整型的参数,(int) y用来说明参数类型
实例的方法总是可以直接访问它的实例变量,但是不能在main函数中直接访问,故需要通过setter/ getter 方法。
(2)@implementation部分
对interface部分声明方法的实现:
@implementation Fraction
-(void) print
{
NSLog(@"%i/%i",Numerator, Denominator);
}
-(void) setNumerator: (int)n
{
Numerator = n;
}
-(void) setDenominator: (int)d
{
Denominator = d;
}
@end
与@interface 类似, 每种方法的定义通过方法的类型、返回值、和参数进行标识,后面会使用
@property @synthesize 简单是实现set 和get 方法。
(3)program部分
这部分包含解决特定问题的代码:
int main ()
{
@autoreleasepool {
Fraction *myFraction; //表示myFraction 是一个Fraction 类型对象。
//创建一个实例并初始化
myFraction = [[Fraction alloc] init]; //初始化对象也可以使用[Fraction new]; 但是一般建议使用。向某个类发送alloc消息,便获得该类的新对象,并对象分配存储空间,init用来初始化类的实例变量;
//设置分数分1/3
[myFraction setNumerator:1]; //调用set 方法对myFraction对象中的成员变量赋值
[myFraction setDenominator:3];
//调用print方法 显示分数
NSLog(@"The value of myFraction is:");
[myFraction print]; //调用print 方法
}
return 0;
}
上面的的输出结果为1/3;