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

发布时间:2020-07-11 11:17:58 作者:ymanmeng123
来源:网络 阅读:353

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




推荐阅读:
  1. 你有什么技能是公司离不开你
  2. PHP的类与对象

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

ios 对象

上一篇:怎么实现PHP梳排序算法

下一篇:Cannot access type method on Ruby class

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》