zoukankan      html  css  js  c++  java
  • 张超超OC基础回顾01_类的创建,申明属性,以及本质

    一、 类的声明和实现&规则

    1.如何编写类的声明

    @interface开头 , 以@end结尾, 然后再class name对应的地方写上 事物名称, 也就是类名即可

    注意: 类名的首字符必须大写

    声明一个类的目的就是为了告诉系统, 我们这个类中有哪些属性行为

     OC类声明中属性只能在写@interface和@end之间的{}中

    注意: 编写OC类属性的时, 建议将所有属性的名称前面都加上"_",这个是规范,记住就行了。

     类名后面的 :NSObject 是为了让我们的Iphone类具备创建对象的能力(继承),也就是说,可以直接用[Iphone new];来创建一个新的对象,不然没有这个new这个类方法,因为new这个方法是存在于NSObject中的。

     @interface Iphone : NSObject

     @end

    {
    //    注意: 默认情况下, OC对象中的属性是不能直接访问的
        @public  // 只要让类中的属性公开, 以后就可以直接通过一个指向结构体的指针来操作对象中的属性,真实写代码不这么做。
        float _model; // 型号  0
        int _cpu; // cup   0
        double _size; // 尺寸  0
        int _color; // 颜色  0
    }
    
    // 对象方法
    // 因为OC方法中的()有特殊的用途, OC方法中的()是用来扩住数据类型的,只要有数据类型就得用()来扩住,下面是不待参数,没有返回值的最简单的一个方法,"-"开头的是对象方法,"+"开头的是类方法
    - (void)about;
    // 有返回值没有参数的, 读取短信,会返回括号类型(字符串)的一个值
    - (NSString *)loadMessage;
    
    // 有返回值有参数的, 打电话
    // int signal(int number);
    // 注意: OC中的方法如果有参数, 那么每个参数的数据类型前面必须加上一个:
    // 注意: 当前这个有参数的方法它的方法名称是  signal:
    //       冒号也是方法名称的一部分
    - (int)signal:(int)number;
    
    // 有返回值并且有多个参数的, 发短信
    // int sendMessage(int number, char *content);
    // 下面这个方法的方法名称是 sendMessage::
    //- (int)sendMessage:(int)number :(char *)content;
    
    // 为了提高我们的阅读性, OC方法允许我们给每个参数添加一个标签来说明当前参数的含义
    // 注意: 标签也是方法名的一部分
    // 方法名是 sendMessageWithNumber:andContent:
    - (int)sendMessageWithNumber:(int)number andContent:(char *)content;
    // 类方法
    // 如果定义类方法, 类方法的写法和对象方法一模一样, 除了前面的-号不同以外 只需要将对象方法的-号换成+, 那么就定义了一个类方法,类方法的实现效率要比对象方法高,所以如果该方法中没有用到类中的属性(成员变量)建议用类方法来节约性能。
    + (int)sumWithValue1:(int)value1 andValue2:(int)value2;
    
    + (void)demo;

    总结:

    注意: 如果声明的是对象方法那么就必须实现对象方法

        如果声明的是类方法那么就必须实现类方法

     类方法和对象方法的区别

     0. 对象方法以-开头

        类方法以+开头

     1. 对象方法必须用对象调用

        类方法必须用类来调用

     2. 对象方法中可以直接访问属性(成员变量)

        类方法中不可以直接访问属性(成员变量)

     3. 类方法和对象方法可以进行相互调用

        4.1对象方法中可以直接调用类方法

        4.2类方法中间接调用对象方法  (注意: 不建议这样使用)

        4.3类方法中可以直接调用其它类方法

        4.4对象方法中可以直接调用对象方法

      类方法的应用场景

     如果方法中没有使用到属性(成员变量), 那么能用类方法就用类方法

     类方法的执行效率比对象方法高

     类方法一般用于定义工具方法:字符串查找,文件操作,数据库操作等等。。。

    2.如何编写类的实现

    @implementation开头, 以@end结尾, 然后在class对应的地方写上声明时声明的类的名称, 必须和声明的类名一模一样

    @implementation Iphone
    
    // 行为的实现,可以对象方法,可以类方法
    
     
    
    @end

        如何通过一个类来创建对象

        在OC中想要通过一个类来创建一个对象, 必须给类发送一个消息

        如何发送消息?   在OC中只要想要发送消息就先写上 [类名称/对象名称 方法名称];

         只要通过一个类调用类的new方法, 也就是给类发送一个叫做new的消息之后

         系统内部就会做3件事情

         1. 为Iphone类创建出来得对象分配存储空间

         2. 初始化Iphone类创建出来的对象中的属性

         3. 返回Iphone类创建出来的对象对应的地址

        

        通过一个Iphone类型的指针接收了 Iphone对象的地址

        如果使用给一个指针保存了某一个对象的地址, 那么我们就称这个指针位之为某个类型的对象(理解一下这句话)

        利用Iphone类型的指针保存了Iphone对象的地址, 那么我们就称Iphone类型的指针p之为Iphone对象

    // 1.创建对象
        // 每次给Iphone类发送一个new消息都会开辟一块新的存储空间
        // 也就意味着每次发送new消息创建出来的对象都是一个新的对象,彼此之间互不干涉的
        Iphone *p = [Iphone new];
        p->_color = kIColorWhite;
        p->_cpu = 1;
        p->_model = 4;
        p->_size = 3.5;
        
        // 2.给对象发送消息
        [p about];

        

        OC中的类其实本质就是一个结构体, 所以p这个指针其实就是指向了一个结构体

       

     struct Person {
         int age;
            char *name;
        };
    
        struct Person sp;
       struct Person *sip = &sp;
    
        (*sip).age = 30; // 改变指针只想的结构体中的值
    
        (*sip).name = "lnj";
    
        sip->age = 30;
    
        sip->name = "lnj"
  • 相关阅读:
    ng机器学习视频笔记(八) ——机器学习系统调试(cv、查准率与召回率等)
    ng机器学习视频笔记(七) ——神经网络的代价函数、反向传播、梯度检验、随机初始化
    post body 传输参数
    laravel队列使用
    nginx配置框架问题
    中大型网站架构之路一
    mongo笔记2
    架构4(lvs lb集群解决方案二 lvs+keepalived)
    架构3(基于LVS LB集群解决方案一:piranha)
    YII2 BUG记录
  • 原文地址:https://www.cnblogs.com/XXxiaotaiyang/p/4983543.html
Copyright © 2011-2022 走看看