zoukankan      html  css  js  c++  java
  • OC语言-02-OC语言-基础知识

    一、基础语法

    1> OC语言和C语言

    • C语言是面向过程的语言,OC语言是面向对象的语言
    • OC语言继承了C语言,并增加了面向对象的思想
    • 以下内容只介绍OC语言与C语言的不同之处

    2> 关键字

    • OC语言的关键字大部分以@开头,也有小部分一字母或下划线开头

    3> 字符串

    • OC语言有自己特有的字符串,以@开头,区别于C语言字符串

    4> BOOl类型

    • 只有YES和NO两种取值
    • 本质上是char类型,但理解为整型
    • BOOL类型是由 条件编译机制引进的

    5> #import与#include

    • 都是将文件内容拷贝到指令出现的代码行
    • 系统文件用尖括号,用户自定义的文件用圆括号
    • #import包含的文件中有条件编译指令,可以防止文件被多次拷贝

    6> NSLog与printf

    1. NSLog

      ① NSLog函数包含在Foundation框架中
      ② NSLog函数接收的是OC语言字符串
      ③ NSLog函数默认在结束处输出换行
      ④ NSLog函数不能以%s格式输出包含中文的字符串
      
    2. printf

      ① printf函数包含在stdio.h文件中
      ② printf函数接收的是C语言字符串
      ③ printf函数需要使用换行符'
      '
      
    3. NSLog的其他用途

      ① 通过_LINE_参数输出改代码所在的行号
      ② 通过_FILE_参数输出改代码所在的文件的文件名
      ③ 通过_func_参数输出代码所在的函数的函数名
      

    二、类、对象和方法

    1> 类

    1. 类与结构体

      ① 结构体是数据的封装
      ② 类是数据及与数据相关操作的封装
      
    2. 类的声明

      ① 用@interface和@end组合来声明一个类,通常继承与根类NSObject
      ② 指定类名:首字母大写,使用驼峰标示,不包含数字
      ③ 声明属性列表:以下划线开头,可以与get方法的名称区分开
      ④ 声明方法列表:包括类方法和对象方法
      
    3. 类的实现

      ① 用@implementation和@end组合来实现类
      ② 实现类声明中的方法列表
      ③ 类的实现也可以定义实例变量,通常不这样定义
      ④ 实现未声明的类会发出警告
      
    4. 类的本质

      ① 类本质上也是一个对象,是class类定义的对象,称为类对象
      ② 使用class方法可以获取类对象
      ③ 每个类中都会有一个superclass指针指向其父类
      
    5. 类的加载和初始化

      ① 加载
      	1)类在使用之前会被加载至内存,加载完毕调用+(void)load方法
      	2)所有的类只会被加载一次
      	3)方法会在类加载的同时被加载
      	4)某个类定义的所有对象的isa指针都指向内存中该类的唯一副本
      	5)首先加载父类,其次是子类,最后是分类
      ② 初始化
      	1)类在使用时才会调用initialize方法初始化
      	2)没有使用的类不会调用initialize方法
      	3)首先调用父类的初始化方法,其次是子类
      
    6. 类的使用注意

      ① 类的声明和实现必须成对出现
      ② 类不能嵌套声明和实现
      ③ 成员变量不能在定义的时候初始化,也不能直接使用
      ④ 成员变量不能用static等关键字修饰
      ⑤ 访问没有的成员变量会报错
      ⑥ 成员变量必须写在大括号内,方法列表不能写在大括号内
      ⑦ 类的声明必须出现在使用之前
      
    7. @public、@protected、@private与@package

      ① @public修饰的成员变量在任何地方都可以直接访问
      ② @protected修饰的成员变量可以在当前类以及子类的对象方法中直
        接访问,默认为该类型
      ③ @private修饰的成员变量只能在当前类的对象方法中直接访问,在
        实现中声明的成员变量默认为该类型
      ④ @package修饰的成员变量在同一个“体系内”(框架)可以访问,
        介于@private和@public之间
      

    2> 对象

    1. 对象与类

      ① 类是具有相同或相似属性和操作的对象的抽象;对象是类的一个实例,
        是类通过调用一定的方法创建的
      ② 类本身会占用内存空间,包含所有的方法列表
      ③ 类的成员变量不会占用内存空间,只有在定义对象时才会分配存储空
        间
      
    2. 对象的本质

      ① 本质上,我们研究的一切事物皆是的对象,包括具体事物和抽象事物
      ② 每个对象总会携带它的isa成员,指向该对象的类
      ③ 系统总会携带对象的相关信息
      
    3. 对象的创建和初始化

      ① 初始化方法通常用init开头
      ② 类方法alloc和init完成对象的创建和初始化
      ③ 类方法new可以代替alloc和init完成对象的创建并初始化
      ④ 在对象的初始化时会加载一次类,返回一个该类型的指针
      
    4. 匿名对象

      ① 每次创建的匿名对象都是不同的对象
      ② 匿名对象会造成内存泄露,尽量不要创建类似匿名对象的对象
      

    3> 方法

    1. 方法的定义

      ① 返回值类型:指定函数返回值的类型
      ② 参数列表:多个参数用冒号及冒号前的描述隔开
      ③ 方法名:在有参数列表的方法中,方法名包括冒号及冒号前的描述
      
    2. 类方法

      ① 以加号(+)开头
      ② 只能通过类名调用,可以在中括号内调用
      ③ 不能访问实例变量
      ④ 当不需要访问成员变量的时候通常使用类方法
      ⑤ 工具类的方法通常为类方法
      
    3. 对象方法

      ① 以减号(-)开头
      ② 只能通过对象调用,可以在中括号内调用
      ③ 对象方法能访问实例变量
      
    4. 方法的使用注意

      ① 方法不能独立与类而存在
      ② 方法有声明就必须有实现,否则会报错
      ③ 方法只有实现,没有实现,仍然能够调用,但是会发出警告
      ④ 访问没有的方法会警告
      ⑤ 类方法可以和对象方法同名
      ⑥ 方法不能用static等关键字修饰
      ⑦ 带参数的方法,一个参数对应一个冒号,通常在每个冒号前写描述
      
    5. 方法与函数的区别

      ① 函数的定义可以出现在文件的任意位置,方法只能出现在
        @implementation和@end之间
      ② 函数归文件所有,方法归类/对象所有
      ③ 方法通过类/对象调用,函数不依赖于类/对象
      ④ 方法可以访问成员变量,函数不可以
      

    三、示例

    ```
    /*
     1.定义一个Dog类,具有属性:毛色、体重;方法:吃、跑、比较两条狗的体重
     2.定义一个Person类,具有属性:dog;方法:遛狗,喂狗、与邻居比较狗的体重
     */
    //Foundation框架中包含NSLog函数、NSObject类等得定义
    #import <Foundation/Foundation.h>
    
    //定义一个枚举来表示三种颜色:红绿蓝
    typedef enum
    {
        ColorRed, //红色
        ColorGreen, //绿色
        ColorBlue //蓝色
    } Color;
    
    //定义一个Dog类,具有属性:毛色、体重;方法:吃、跑、比较两条狗的体重
    @interface Dog : NSObject
    {
        //Dog的属性列表
        @public //声明公共成员变量
        int _weight; //体重
        Color _color; //毛色
    }
    
    //Dog方法列表
    //eat方法
    - (void)eat;
    //run方法
    - (void)run;
    //与另一条狗比较体重
    - (int)compareTheWeihtWithOtherDog:(Dog *)dog;
    
    @end
    
    @implementation Dog
    
    - (void)eat
    {
        //Dog每吃一次,体重增加一公斤
        _weight++;
    }
    - (void)run
    {
        //Dog每跑一次,体重减少一公斤
        _weight--;
    }
    - (int)compareTheWeihtWithOtherDog:(Dog *)dog
    {
        //使用三目运算符
        return _weight > dog->_weight? _weight:dog->_weight;
    }
    
    @end
    
    //定义一个Person类,具有属性:dog;方法:遛狗,喂狗、与邻居比较狗的体重
    //Dog类的声明
    @interface Person : NSObject
    {
        //Person属性列表
        @public //声明公共成员变量
        Dog *_dog; //狗
    }
    
    //Person方法列表
    //遛狗方法
    - (void)liuGou;
    //喂狗方法
    - (void)weiGou;
    //与邻居家的狗比较体重
    - (void)compareTheWeihtWithOtherPerson:(Person *)Person;
    
    @end
    
    //Person类的实现
    @implementation Person
    
    - (void)liuGou
    {
        //调用Dog的run方法
        [_dog run];
    }
    - (void)weiGou
    {
        //调用Dog的eat方法
        [_dog eat];
    }
    - (void)compareTheWeihtWithOtherPerson:(Person *)Person
    {
        int result;
        //调用狗的比较体重方法
        result = [_dog compareTheWeihtWithOtherDog:Person->_dog];
        NSLog(@"较重的狗的体重为%d", result);
    }
    
    @end
    
    
    int main()
    {
        //创建两条狗
        Dog *d = [[Dog alloc] init];
        Dog *d2 = [[Dog alloc] init];
        //创建两个人
        Person *p = [Person new];
        Person *p2 = [Person new];
        
        //为第1条狗的成员变量赋值
        d->_color = 0;
        d->_weight = 10;
        //为第2条狗的成员变量赋值
        d->_color = 1;
        d->_weight = 20;
        //为两个人的够对象赋值
        p->_dog = d;
        p2->_dog = d2;
        //比较这两个人得狗,输出较重狗的体重
        [p compareTheWeihtWithOtherPerson:p2];
        
        return 0;
    }
    ```
  • 相关阅读:
    Java基础-集合框架的学习大纲
    Java多线程并发学习-进阶大纲
    Spring学习大纲
    Netty学习大纲
    分布式学习大纲
    数据库学习大纲
    缓存学习大纲
    JVM-jvm学习大纲(0)
    多线程学习-基础(十三)(学习参考·网摘) ArrayBlockingQueue源代碼解析(base jdk 1.8)
    C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/4723137.html
Copyright © 2011-2022 走看看