zoukankan      html  css  js  c++  java
  • [objective-c] 01

    简介

    本章内容主要对Objective-C语言的基础语法进行阐述,包含以下知识点:

    1. OC类的声明语法
    2. OC类的成员变量声明
    3. OC类的方法声明
    4. OC类的实现
    5. OC属性机制
    6. OC对象创建
    7. OC方法调用
    8. OC点语法
    9. Self关键字
    10. 自定义初始化方法

    1.OC类的声明

    OC声明类的关键字为:@interface和@end

    关键字后面跟类目和父类名,类名与父类名间用:进行分隔。

    例如:

    @interface Triangle: NSObject
    @end
    

    这样的语句便声明了一个三角形类。
    其中NSObject为系统的根类。OC语法中,创建一个类必须指定其父类。当不确定其父类时,用NSObject类作为默认父类。

    2.OC类的成员变量

    为一个类声明成员变量的语法非常简单。如下

    @interface Triangle: NSObject
    {
        //在此大括号内声明成员变量
        double _a;
        double _b;
        double _c;
    }
    @end
    

    其中_a_b_c分别为此类的成员变量。在OC中成员变量通常以_开头。

    成员变量可以设置如下访问权限:

    公开访问`@public`

    受保护访问`@protected`

    私有变量`@private`

    其中受保护的权限是默认权限,也是平时开发常用的权限。在受保护权限下,成员变量只能在本类的方法实现中访问,外界无权访问。

    3.OC类的方法声明

    为一个类声明方法的语法如下

    @interface Triangle: NSObject
    {
        //在此大括号内声明成员变量
        double _a;
        double _b;
        double _c;
    }
    -(void)setA:(double)a;
    -(void)setB:(double)b;
    -(void)setC:(double)c;
    
    -(double)a;
    -(double)b;
    -(double)c;
    
    -(double)area;
    @end
    

    声明方法首先需要确定方法类型。在OC语法中,方法有两种类型分别为

    -(void)test;//减号方法,俗称对象方法
    
    +(void)test;//加号方法,俗称静态方法或类方法
    

    一般情况下都为对象方法,只有在下列特殊情况下使用加号方法

    1. 便利构造器方法
    2. 单例share方法
    3. 对纯过程封装

    这三种情况会在以后的课程中逐步遇到。目前大家统一都只用减号方法。

    声明方法第二步要确定方法的返回值类型。

    -(返回值类型)test;
    

    声明方法第三步确定方法名和参数

    OC声明方法的第三步的语法是参数描述字段 : (形参类型) 形参名

    如果有多个参数,就将此模式依次重复。

    -(void)test;//没有输入参数的方法
    
    -(void)testA:(int)a;//有一个参数的方法声明
    
    -(void)testA:(int)a B:(int)b;//有两个参数的方法声明
    

    方法中有两类较特殊的方法

    类似-(void)setA:(int)a 这样为成员变量赋值的方法称为setter方法

    类似-(double)a 这样读取成员变量值的方法称为getter方法

    4.OC类的实现

    OC类中所有声明的方法都需要相应实现。实现关键字为@implementation`类名`

    例如:

    @implementation Triangle
    
    -(void)setA:(int)a
    {
        _a = a;
    }
    -(void)setB:(int)b
    {
        _b = b;
    }
    -(void)setC:(int)c
    {
        _c = c;
    }
    
    -(double)a
    {
        return _a;
    }
    -(double)b
    {
        return _b;
    }
    -(double)c
    {
        return _c;
    }
    -(double)
    {
        //根据成员变量的值,计算三角形面积
        double s=(_a+_b+_c)/2;
        return sqrt(s*(s-_a)*(s-_b)*(s-_c));
    }
    
    @end
    

    5.OC属性机制

    属性机制是通过声明属性,从而在编译时自动补充代码的一项技术。

    声明一个属性在编译时,会补充以下一系列代码:

    1. 声明一个成员变量
    2. 声明一个成员变量的setter方法
    3. 声明一个成员变量的getter方法
    4. 实现一个成员变量的setter方法
    5. 实现一个成员变量的getter方法

    声明属性的关键字为`@property`代码如下:

    @property double a;
    

    注意:声明的属性为a,但是编译时生成的成员变量为_a。

    通过属性可以把之前的三角形类重构

    @interface Triangle : NSObject
    
    @property double a;
    @property double b;
    @property double c;
    
    -(double)area;
    
    @end
    
    @implementation Triangle
    
    -(double)
    {
        //根据成员变量的值,计算三角形面积
        double s=(_a+_b+_c)/2;
        return sqrt(s*(s-_a)*(s-_b)*(s-_c));
    }
    
    @end
    

    6.OC对象创建

    OC语法中创建对象分三步,缺一不可。

    1. 创建对象指针
    2. 为对象指针分配内存:alloc方法分配内存
    3. 将分配的内存进行初始化:init初始化内存
    Triangle * t;
    t = [[Triangle alloc] init];
    
    

    7.OC方法调用

    完成对象创建之后,就可以用对象指针调用对象的方法。
    OC语言中方法调用使用[]操作符。例如:

    [t setA:10];
    double = [t area];
    
    

    操作符内有两个参数:第一个参数为对象指针,第二个参数为需要调用的方法。

    -号方法,俗称对象方向,都需要用对象指针进行调用。

    +号方法,俗称类方法,都需要用类目进行调用,例如alloc方法。

    8.OC点语法

    点语法是OC的另一个重要特性。主要用来简化settergetter方法的调用。

    [t setA:10]; // 正常语法调用setter方法
    t.a = 10; // 使用点语法调用setter方法
    
    double a1 = [t a]; // 正常语法调用getter方法
    double a2 = t.a; // 使用点语法调用getter
    

    使用点语法调用和正常调用完全等价,编译器会根据.和等号的关系自动调用setter还是getter方法。

    9.Self关键字

    在OC语言中,self关键字为方法调用时的隐含参数。self可以在方法的实现中进行使用,代表调用此方法的对象。通常我们使用self调用自己的某些方法

    10.自定义初始化方法

    当一个对象在创建时,需要某些不能缺少的值时。我们可以自己重新定义初始化方法。

    例如:三角形对象在创建的时候必须有三个边长信息,不然三角形对象无意义。

    我们就要声明一个新的初始化方法,并实现

    -(instancetype)initWithA:(double)a B:(double)b C:(double)c;
    
    - (instancetype)initWithA:(double)a B:(double)b C:(double)c
    {
        self = [super init];
        if (self) 
        {
            self.a = a;
            self.b = b;
            self.c = c;
        }
        return self;
    }
    

    其中,instancetype为固定写法,表示返回类型由编译检查器自动辨别。在实现中将输入参数依次赋值给本身属性。

    再调用如下代码

    Triangle * t = [[Triangle alloc] initWithA:10 B:11 C:12];
    

    这样就实现了初始化同时赋值。

    -keep calm and move on!
  • 相关阅读:
    12.22冲刺总结
    Android远程服务
    短信电话监听
    Android本地服务
    意图
    多线程下载
    异步HTTP请求
    提交数据到服务器
    通过HTTP访问网络资源
    观察者
  • 原文地址:https://www.cnblogs.com/lqios/p/4264164.html
Copyright © 2011-2022 走看看