重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
接口与实现的分离
专注于为中小企业提供成都做网站、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业和平免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
Objective-C定义一个类,分成两部分:接口、实现
接口(公开):声明类中的成员变量、属性、方法。
实现(隐藏):实现类中的方法。
接口与实现分离的好处:
想要使用这个类时只需知道接口部分即可。
同时将实现部分隐藏起来,有利于代码的封装
例如:实现一个汽车类,只需要知道如何开车,而不需要汽车如何工作的
定义类的接口部分
关键字:@interface @end
@interface className : parentClassName
{
//成员变量
}
//方法的声明以及属性的声明
@end
成员变量的访问权限:
@public 作用域不受限制 //如
@protected 作用域被限定在类和子类中
@private 作用域被限定在类中
@package 作用域被限定在整个框架中
默认是@protected
方法的声明方式:
- (type) methodName;
示例代码:
//接口部分:属性、方法的声明 @interface AMStudent : NSObject {//编程规范:属性名以_开头,多个单词,除第一个单词意外的单词首字母大写 NSInteger _id; NSString *_name;//OC对象必须用指针存储地址 NSInteger _age; NSInteger _score; } /** 显示学生信息 */ - (void) showInfo; @end
/** */ 是Xcode特有的注释方式
在Xcode环境中,调用该方法的自动补齐提示处,提示注释内容
小伙伴们可以试一试
定义类的实现部分
关键字:@implementation @end
@implementation class_name
{
//私有成员变量
}
//方法的实现
@end
可以在实现部分定义成员变量,但不鼓励这么去做
权限一定是private;不能和接口部分的成员变量重复
方法的实现和实现函数类似
示例代码:
//实现部分:方法的定义 @implementation AMStudent - (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 = [AMStudent new];
在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) identifier andWithName:(NSString*) name andWithAge:(NSInteger) age andWithScore:(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 = [NSString stringWithFormat:@"AMStudent : [id:%ld][name:%@][age:%ld][score:%ld]", self->_id, self->_name, self->_age, self->_score]; return p; }
接口的源文件扩展
在类的源文件的@implementation之前添加一个接口的扩展,是声明内部方法、成员变量、属性的常见做法
在接口扩展中声明的内容将不对外开放,仅允许在该类的源文件内部使用
语法:在@implementation前
@interface 类名 ()
...
@end