Objective-C(2)离不开的---类与对象

  • 接口与实现的分离

    专注于为中小企业提供成都做网站、网站设计服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业和平免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

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


分享文章:Objective-C(2)离不开的---类与对象
文章位置:http://myzitong.com/article/jgejji.html