• 张超超OC基础回顾_05 property修饰符,id类型,instancetype。。。


    一、property

     如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性

     如果只提供了getter方法, 那么我们称这个属性为只读属性

     如果只提供了setter方法, 那么我们称这个属性为只写属性

     如果既没有提供getter也没有提供setter方法, 那么我们称这个属性为私有属性

     格式:

     @property(属性修饰符) 数据类型 变量名称;

    @property(readwrite) int age;   // 可读可写的 ,不用写的  默认就是这
    /*
     - (void)setHeight:(double)height;
     - (double)height;
     
     - (void)setHeight:(double)height;
     - (double)abc;
     */
    @property(getter=abc) double height;
    
    /*
     - (void)setWeight:(double)weight;
     - (void)tiZhong:(double)weight;
     */
    @property(setter=tiZhong:) double weight;
    // readonly: 代表只生成getter方法不生成setter方法
    @property(readonly) NSString * name;
    
    // 是否已婚
    // 程序员之间有一个约定, 一般情况下获取BOOL类型的属性的值, 我们都会将获取的方法名称改为isXXX,这样方便沟通,可读性也好点
    @property(getter=isMarried) BOOL married;

     二、id类型

    这个会用就行了,一般是用于多态的时候,我也没乱用过,不然这玩意编译不报错,到时候不好找,直接拷贝概念了

    /*
    id是一个数据类型, 并且是一个动态数据类型
         既然是数据类型, 所以就可以用来
         1.定义变量
         2.作为函数的参数
         3.作为函数的返回值
         
         默认情况下所有的数据类型都是静态数据类型
         静态数据类型的特点: 
         在编译时就知道变量的类型, 
         知道变量中有哪些属性和方法
         在编译的时候就可以访问这些属性和方法, 
         并且如果是通过静态数据类型定义变量, 如果访问了不属于静态数据类型的属性和方法, 那么编译器就会报错
         
         动态数据类型的特点:
         在编译的时候编译器并不知道变量的真实类型, 只有在运行的时候才知道它的真实类型
         并且如果通过动态数据类型定义变量, 如果访问了不属于动态数据类型的属性和方法, 编译器不会报错
         
         id == NSObject * 万能指针
         id和NSObject *的区别: 
         NSObject *是一个静态数据类型
         id  是一个动态数据类型
    */
    // 通过静态数据类型定义变量, 不能调用子类特有的方法
        // 通过动态数据类型定义变量, 可以调用子类特有的方法
        // 通过动态数据类型定义的变量, 可以调用私有方法
        
        // 弊端: 由于动态数据类型可以调用任意方法, 所以有可能调用到不属于自己的方法, 而编译时又不会报错, 所以可能导致运行时的错误
        // 应用场景: 多态, 可以减少代码量, 避免调用子类特有的方法需要强制类型转换
        id obj = [Person new];
        [obj sleep];
        [obj test];
        [obj eat];
        
        id obj2 = [Student new];
        [obj2 eat];
        [obj2 test];
    
        
        // 为了避免动态数据类型引发的运行时的错误, 一般情况下如果使用动态数据类型定义一个变量, 在调用这个对象的方法之前会进行一次判断, 判断当前对象是否能够调用这个方法
    //    id obj = [Person new];
        id obj = [Student new];
    
      // 先判断一下
    if ([obj isKindOfClass:[Student class]]) { // isKindOfClass , 判断指定的对象是否是某一个类, 或者是某一个类的子类 [obj eat]; }
  • 相关阅读:
    win10安装node后npm 报错
    nodejs 图片的像素级别处理
    vue 等比例截图组件,支持缩放和旋转
    撸一个 vue 的截图组件,按比例截取
    原生 js 录屏功能
    Mongodb命令行导入导出数据
    Linux 下配置 iSCSI 客户端
    基于 Docker 实现 DevOps 的一些探索
    10 张图带你深入理解 Docker 容器和镜像
    浅谈 Docker 安全合规建设
  • 原文地址:https://www.cnblogs.com/XXxiaotaiyang/p/4991407.html
Copyright © 2020-2023  润新知