接口与实现的分离

Objective-C定义一个类,分成两部分:接口、实现

接口(公开):声明类中的成员变量、属性、方法。

实现(隐藏):实现类中的方法。

接口与实现分离的好处:

想要使用这个类时只需知道接口部分即可。

同时将实现部分隐藏起来,有利于代码的封装

例如:实现一个汽车类,只需要知道如何开车,而不需要汽车如何工作的


定义类的接口部分

关键字:@interface @end

@interface className : parentClassName

{

//成员变量

}

//方法的声明以及属性的声明

@end

成员变量的访问权限:

@public 作用域不受限制 //如

@protected 作用域被限定在类和子类中

@private 作用域被限定在类中

@package 作用域被限定在整个框架中

默认是@protected

方法的声明方式:

- (type) methodName;

示例代码:

//接口部分:属性、方法的声明@interfaceAMStudent:NSObject{//编程规范:属性名以_开头,多个单词,除第一个单词意外的单词首字母大写NSInteger_id;NSString*_name;//OC对象必须用指针存储地址NSInteger_age;NSInteger_score;}/**显示学生信息*/-(void)showInfo;@end

/** */ 是Xcode特有的注释方式

在Xcode环境中,调用该方法的自动补齐提示处,提示注释内容

小伙伴们可以试一试


定义类的实现部分

关键字:@implementation @end

@implementation class_name

{

//私有成员变量

//方法的实现

@end

可以在实现部分定义成员变量,但不鼓励这么去做

权限一定是private;不能和接口部分的成员变量重复

方法的实现和实现函数类似


示例代码:

//实现部分:方法的定义@implementationAMStudent-(void)showInfo{NSLog(@"[id:%ld][name:%@][age:%ld][score:%ld]",self->_id,self->_name,self->_age,self->_score);}@end

其他注意:

@interface...@end以及@implementation...@end不能嵌套

接口部分声明的方法,在实现部分必须要给出实现

实现部分的方法如果在接口部分没有声明接口,则成为一个内部方法不对外公开



实例化对象

实例化一个对象,是按照定义的类创造出一个实体对象,如根据汽车的图纸(类)造出汽车(对象)。

最简单的方法是:

className * objName = [className new];

Objective-C的对象,必须使用指针存储地址,不能创建局部对象和全局对象

[]运算符的含义是: 向对象发送一个消息,对象收到消息后会调用对应的方法。

new这个消息的含义是: 创建一个对象(分配空间、成员变量初值为0)

示例代码:

AMStudent*ps=[AMStudentnew];


在OC中类其实也是一种对象

所以new这个消息是发送给类这种对象的

对应方法我们称之为类方法,和对象方法是不同的


对象方法

要和函数区分:

函数可直接调用,方法需要通过[]发送消息

方法内可以直接使用类(对象)中的成员变量


没有参数的方法:

接口声明:- (returnValueType) methodName;

方法调用:[objName methodName]

-(void)showInfo;-(AMStudentScoreLevel)getScoreLevel;//AMStudentScoreLevel是枚举类型


一个参数的方法:

接口声明: - (returnValueType) methodName: (parType) parName;

方法调用: [objName methodName:argName];

/**设置学生的ID*/-(void)setId:(NSInteger)ID;


多个参数的方法:

接口声明:

-(returnValueType) methodName1: (par1Type) par1Name

methodName2:(par2Type) par2Name ...;

方法调用:

[objName methodName1:argName methodName2:arg2Name ...];

苹果公司鼓励工程师使用这种句子一样写法 ,即代码本身具有注释的部分功能

/**设置学生信息*/-(void)setInfoWithId:(NSInteger)identifierandWithName:(NSString*)nameandWithAge:(NSInteger)ageandWithScore:(NSInteger)score;


方法中的self关键字:

是一个指针,指向当前对象,即调用这个方法的对象

注意:self指针的指向不能变化

用途:

成员变量(属性)与参数名的区分

获得当前对象的地址(如作为返回值)

调用对象的其他方法

-(void)showInfo{NSLog(@"[id:%ld][name:%@][age:%ld][score:%ld]",self->_id,self->_name,self->_age,self->_score);}


description方法:

任何一个类都可以实现这个方法(无需声明),该方法是由父类NSObject继承而来的

该方法返回一个OC对象类型NSString

在NSLog()函数打印时,指定%@,将自动调用该方法并打印返回的字符串。

-(NSString*)description{//重写的NSObject的方法,%@输出的就是返回的字符串NSString*p=[NSStringstringWithFormat:@"AMStudent:[id:%ld][name:%@][age:%ld][score:%ld]",self->_id,self->_name,self->_age,self->_score];returnp;}



接口的源文件扩展

在类的源文件的@implementation之前添加一个接口的扩展,是声明内部方法、成员变量、属性的常见做法

在接口扩展中声明的内容将不对外开放,仅允许在该类的源文件内部使用

语法:在@implementation前

@interface 类名 ()

...

@end