[学习交流] OC学习笔记之id类型及应用场景

2023-11-03

1、NSObject访问子类方法
NSObject是所有类的基类,可以指向任何子类
例如:
  1. #import <Foundation/Foundation.h>
  2. #pragma mark Animal类声明部分
  3. @interface Animal: NSObject
  4. -(void)eat;
  5. @end
  6. #pragma mark Animal类实现部分
  7. @implementation Animal
  8. -(void)eat{
  9.     NSLog(@"Animal eat...");
  10. }
  11. @end
  12. #pragma mark Dog类声明部分
  13. @interface Dog: Animal
  14. -(void)eat;
  15. @end
  16. #pragma mark Dog类实现部分
  17. @implementation Dog
  18. -(void)eat{
  19.     NSLog(@"Dog eat...");
  20. }
  21. @end

  22. int main(int argc, const char * argv[])
  23. {

  24.     @autoreleasepool {
  25.         NSObject *obj = [Animal new];
  26.         NSObject *obj2 = [Dog new];
  27.         
  28.         Animal *ani =[Dog new];
  29.         [ani eat];
  30.         //访问子类特有的方法
  31.         [(Animal*)obj eat];
  32.         [(Dog*)obj2 eat];
  33.         
  34.     }
  35.     return 0;
  36. }
复制代码


打印结果:
2015-10-05 10:36:57.614 Demo01[1278:303] Dog eat...
2015-10-05 10:36:57.616 Demo01[1278:303] Animal eat...
2015-10-05 10:36:57.617 Demo01[1278:303] Dog eat...

2、id是一种通用的对象类型,它可以用于存储属于任何类的对象
它也可以理解为【万能指针】
【注意】id在定义的时候已经包含了“*”,id指针只能访问os的对象
id类型的定义:
typedef struct objc object{
   Class *isa;
}id;


例如:
      
  1. //id类型使用
  2.         id dog = obj2;
  3.         id animal = obj;
  4.         //id类型使用时不会有类型检查,编译器在遇到id后就认为它是动态类型,就不会检查它的类型
  5.         [dog eat];//狗在跑
  6.         [animal eat];//动物在吃
复制代码

打印结果:
2015-10-05 10:43:32.727 Demo01[1338:303] Dog eat...
2015-10-05 10:43:32.727 Demo01[1338:303] Animal eat...


3、id和instancetype的异同
ios5之后推出了instancetype类型
1)相同点
都可以作为方法的返回类型
2)不同点
A、instancetype可以返回方法所在类相同类型的对象,id只能返回未知类型的对象。
B、instancetype只能作为返回值,不能像id那样作为参数



FROM: http://bbs.itheima.com/thread-247063-1-1.html



动态数据类型id:

数据类型常用的有:
1.int整型;
2.double双精度型;
3.float单精度型;
4.char字符类型;
等......
数据类型的用途是什么呢?
    在计算机语言中,数据类型有三种用途,
1.定义变量;
2.作为函数的参数;
3.作为函数的返回值.
默认情况下,所有的数据类型都是静态数据类型.
默认数据类型的特点如下:
在编译时就知道变量的类型,知道变量中有哪些属性和方法,在编译的时候就可以访问这些属性和方法,并且如果通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错;
id也是一种数据类型,并且是一种动态数据类型,那么id和其他数据类型一样,也有同样的作用;
动态数据类型的特点:
在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道真实的数据类型,并且如果通过动态数据类型定义变量,如果访问了不属于动态数据类型的属性和方法,编译器不会报错.
在多态中,通过静态数据类型定义变量,不能调用子类特有的方法;
  Animal * dog = [[Dog alloc]init];//使用父类接收子类的实例对象;

 Dog * dd = (Dog *)dog;//强制转换为子类类型

 [dd kanMen];//只有强制转换后才能调用子类特有的方法


在多态中,通过动态数据类型定义变量,可以调用子类特有的方法;

 id dog = [[Dog alloc]init];//创建一条狗;

  [dog kanMen];//这条狗可以直接调用Dog类具有的特有方法;

  [dog test];//这条狗还可以调用Dog私有的方法//只有实现没有生命的方法是私有方法;


在多态中,通过动态数据类型定义的变量,可以调用私有的方法
  
 Animal * dog = [[Dog alloc]init];//使用父类接收子类的实例对象;

 Dog * dd = (Dog *)dog;//强制转换为子类类型

  [dd test];//不能调用子类的私有方法

在多态中,如果父类有私有方法,只能在本类的方法中调用,如果子类中有父类私有方法的方法声明,则子类的对象可以直接调用父类的私有方法;(说明,OC中没有真正的私有方法,通过某种途径,父类也是可以调用其私有方法.)

id也存在弊端,由于动态数据类型可以调用任意方法, 所以有可能调用到不属于自己的方法, 而编译时又不会报错, 所以可能导致运行时的错误;

为了避免动态数据类型引发的运行时的错误, 一般情况下如果使用动态数据类型定义一个变量, 在调用这个变量的方法之前会进行一次判断, 判断当前变量是否能够调用这个方法;

if ([dog isKindOfClass:[Dog class]]) {

        //isKindOfClass , 判断指定的对象是否是某一个类, 或者是某一个类的子类

        [dog eat];

    }

//-------------------------------------------------------------------------------------------------------------

if ([dog isMemberOfClass:[Dog class]]) {

        // isMemberOfClass : 判断指定的对象是否是当前指定的类的实例

        [dog eat];

    }

id的应用场景: 多态, 可以减少代码量, 避免调用子类特有的方法需要强制类型转换

注释:
多态的条件:
      1.有继承关系
2.父类指向子类
       3.子类重写父类方法;

#import <Foundation/Foundation.h>

@interface Animal : NSObject

-(void)eat;

@implementation Animal

-(void)eat

{

    NSLog(@"吃饭");

}

-(void)test2

{

    NSLog(@"Animal私有方法test2");

}

@end

//———————————————————————//

@interface Dog : Animal

-(void)eat;

-(void)kanMen;

-(void)test2;

@end

@implementation Dog

-(void)eat

{

    NSLog(@"dog吃肉");

}

-(void)kanMen

{

    NSLog(@"汪汪叫");

}


-(void)test

{

    NSLog(@"私有方法test");

}

@end

//——————————————————————//

@interface Person : NSObject

-(void)eat:(Animal*)an;

@end

@implementation Person

-(void)eat:(Animal *)an

{

    [an eat];

}

@end

//———————————————————————//

int main(int argc, const char * argv[]) {

//    Animal *dog = [[Dog alloc]init];

//    [dog eat];


    //多态情况下,如果需要调用子类的特有属性,需要强制装换为子类类型

//    Animal * dog = [[Dog alloc]init];

//    Dog * dd = (Dog *)dog;

//    [dd kanMen];

//    [dd test];

    

    //使用id类型,在调用子类特有方法的时候,不用再强制转换,可以直接调用;

    //使用id类型,可以调用子类的私有方法;

    id dog = [[Dog alloc]init];

//    [dog kanMen];

//    [dog test];

    

    [dog test2];//



    

// 为了避免动态数据类型引发的运行时的错误一般情况下如果使用动态数据类型定义一个变量在调用这个变量的方法之前会进行一次判断判断当前变量是否能够调用这个方法

//    id dog2 = [[Dog alloc]init];

//    if ([dog2 isMemberOfClass:[Dog class]] ) {

//        [dog2 eat];

//    }

//  



//    Animal * an = [[Animal alloc]init]; 

//    Dog * dog = [[Dog alloc]init];  

//    Person * p = [[Person alloc]init];


//    [p eat:dog];

  

    //真正意义的面向对象;只剩下具体的对象,

    //这里是又创建了一个人,和分别创建了一条狗和一只猫,然后就是人去喂猫和狗;

    

return 0;

 }



from: http://blog.csdn.net/batac_lee/article/details/50576314

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[学习交流] OC学习笔记之id类型及应用场景 的相关文章

  • 《关基保护要求》实施,应用层零信任将发挥重要作用

    2023年5月1日起 国家标准 GB T 39204 2022 信息安全技术 关键信息基础设施安全保护要求 正式实施 这是继 关键信息基础设施安全保护条例 发布后首个正式发布的针对性标准 也代表着关键信息基础设施保护工作部门开展监管 运营者
  • VS2022集成代码规范组件StyleCop.Analyzers应用于解决方案

    背景 项目团队刚刚组件 每个人的代码编写习惯都不一样 希望用一款代码规范的检查插件来规范团队成员编写代码的习惯 在网上找了一遍之后 感觉StyleCop Analyzers比较适用 集成方法 1 NuGet搜索StyleCop Analyz
  • python 中range(10)什么意思_range什么意思python编程【面试题详解】

    今天爱分享给大家带来range什么意思python编程 面试题详解 希望能够帮助到大家 今天来谈一谈关于Python中range 的作用 和我个人的理解 range的中文意思是 范围 幅度 或者是在xxx之间变动 函数原型 range st
  • linux 更改用户权限

    最近一直在忙项目上的事情 没时间更新 项目基本上已经接近尾声 主要是一些部署的收尾工作 在部署的过程中 也遇到了一些问题 先慢慢记录吧 今天主要记录的是 如何提升普通运行为管理员身份 在日常开发过程中 调用第三方程序 该程序由于内部实现的原
  • Dynamics CRM和企业微信集成(一)理论方案

    Dynamics CRM和企业微信集成 一 理论方案 方案简述 工具类都差不多就位了 那么今天开始写点有用的东西 之前的项目有做过CRM和企业微信集成 现在总结一下吧 方案简述 关键是登陆时 把微信ID和CRM用户做绑定 阅读企业微信的AP
  • 小米笔记本pro 双硬盘双系统 opencore引导安装黑苹果

    个人情况说明 小米笔记本PRO 15 6 项目 参数 CPU i5 8250U GPU MX150 内存 8G 硬盘1 三星pm961 256g 硬盘2 intel 240g 注意事项 三星pm981装黑苹果会有问题 嫌麻烦的话建议直接换硬
  • webpack打包后引用cdn的js_webpack系列-externals配置使用(CDN方式引入JS)

    如果需要引用一个库 但是又不想让webpack打包 减少打包的时间 并且又不影响我们在程序中以CMD AMD或者window global全局等方式进行使用 一般都以import方式引用使用 那就可以通过配置externals 这样做的目的
  • commitlint无效 commit-msg不执行

    一 安装commitlint yarn add commitlint config conventional commitlint cli D 二 commitlint无效 commit msg不执行 解决办法 1 删除package js
  • 【spring5学习笔记】-----bean的多实例与单实例

    bean的多实例与单实例 首先介绍概念 什么是spring中bean的多实例和单实例 在上面这个例子中 我们两次调用context的getBean 方法得到的两个对象的引用值是相等的 这说明此时spring是单实例的 两次调用方法得到的是同
  • tensorflow生成随机数及实现随机采样

    文章目录 1 生成随机数 2 随机采样 2 1 实例代码 3 随机打乱数据 1 生成随机数 参考1 tf random normal 从正态分布中输出随机值 tf random normal shape mean 0 0 stddev 1
  • linux创建文件

    转载自 https www cnblogs com lclq p 5741852 html Linux命令 1 创建文件 1 可以使用cat创建一个新的文件 命令 cat gt gt filename 使用cat创建文件时 以系统默认的文件
  • jdk1.8与tomcat7如何兼容使用

    jdk1 8与tomcat7兼容使用 只需要改一个设置 window preperence找到此页面 点击edit将jre设置更换为1 8
  • matlab绘制脑电地形图,脑电地形图的原理及其结果

    脑电地形图 brain electrical activity mapping BEAM 是将脑电信号输人电子计算机进行处理后转换为一种可定位和定量性分析 并用不同颜色的图像显示的检查技术 其优点是可将脑功能变化与形态定位结合 图像直观 形
  • 计算机视觉领域的一些牛人博客

    转载自 blog csdn net carson2005 以下链接是关于计算机视觉 ComputerVision CV 相关领域的网站链接 其中有CV牛人的主页 CV研究小组的主页 CV领域的paper 代码 CV领域的最新动态 国内的应用
  • Linux Select

    文章目录 1 函数原型 1 1 函数参数说明 1 2 返回值 2 相关数据结构与函数 2 1 struct timeval 2 2 fd set 3 编程模型 4 关于select的阻塞 4 select总结 5 Unix5中IO模型 5
  • 服务器不稳定怎么解决?常见的4种问题和6种处理方法

    一 常见的4种问题 1 机房或服务器问题 联系服务器提供商 要求协助排查故障并解决或者更换硬件 2 软件和硬件故障故障问题 要求服务商更换服务器 或者升级服务器 3 网站本身问题 通过优化网站结构 减少垃圾代码等方式来优化网站访问速度 4
  • flutter dart判断文件是否存在

    File txt File data data sms com smsexample files 2 txt var dir bool await txt exists 返回真假 if dirbool
  • css3 flex 实现常见页面布局

    css3 flex 实现常见页面布局 上中下布局 左中右三列布局 圣杯布局 Flex是Flexible Box的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为Flex布局 box display flex 行

随机推荐

  • 云服务器被ddos攻击了怎么办?甜甜来给您解答

    随着互联网科技的发展 网络安全问题日益突出 企业服务器被攻击的事件也越来越频繁 为此快快推出的增值服务高防ip 有效解决了中小企业DDOS攻击问题 同时快快高防ip支持大流量按天付费模式 可按不同业务需求配置弹性防护 成本可控 互联网服务器
  • ansible错误解决:UNREACHABLE Failed to connect to the host via ssh.

    执行过程是 ansible接收动态的hosts与本地的私钥 通过无密码登录方式运行一个playbook 但是运行后始终出现如下问题 PLAY 120 27 26 TASK setup 1 31mfatal 120 27 26 UNREACH
  • Win10系统BitLocker解锁后再次快速锁定办法

    谁都不愿意把自己电脑上资料完全公开 对资料选择性加密处理是唯一的办法 微软Windows7及以后的Windows系统自带磁盘分区BitLocker加密功能是一个不错的选择 BitLocker加密功能的优点之一是可以对磁盘分区进行快速加密 锁
  • jsp不能正常引入jquery($ is not defined)问题分析

    文章目录 1 idea中不能引入jquery step1 step2 2 路径导入问题 3 静态文件不能放在WEB INF下 4 finally jsp中不能正常引入jquery的原因有很多 让我们一步一步来排除 1 idea中不能引入jq
  • 华为面试题: 招聘(javascript)

    题目 某公司组织一场公开招聘活动 假设由于人数和场地的限制 每人每次面试的时长不等 并已经安排给定 用 S1 E1 S2 E2 Sj Ej Si lt Ei 均为非负整数 表示每场面试的开始和结束时间 面试采用一对一的方式 即一名面试官同时
  • 命令行说明中括号的含义

    内的内容表示可写可不写 至少选择大括号内的一个 lt gt 必写项
  • QT删除及创建文件夹

    bool DirMake const QString path QString full path GetFullPath path QDir dir full path if dir exists return true else ret
  • 2022-2023 通信工程专业毕业设计题目选题推荐 - 100例

    文章目录 1前言 2 如何选题 3 通信工程选题方向 2 1 移动通信方向 2 2 嵌入式开发方向 2 3 人工智能方向 2 4 物联网方向 2 5 算法研究方向 2 6 移动应用开发方向 2 7 网络通信方向 3 4 学长作品展示 4 最
  • 二维码PDF417简介及其解码实现(zxing-cpp)

    二维码PDF417是一种堆叠式二维条码 PDF417条码是由美国SYMBOL公司发明的 PDF Portable Data File 意思是 便携数据文件 组成条码的每一个条码字符由4个条和4个空共17个模块构成 故称为PDF417条码 P
  • 【C#学习笔记】数组使用

    using System namespace ConsoleApplication class Program static void Main string args int a new int 3 一维数组 int a new int
  • 如何通过cpolar内网穿透+VNC实现公网远程ubuntu

    文章目录 前言 1 ubuntu安装VNC 2 设置vnc开机启动 3 windows 安装VNC viewer连接工具 4 内网穿透 4 1 安装cpolar 支持使用一键脚本命令安装 4 2 创建隧道映射 4 3 测试公网远程访问 5
  • 毕业设计-基于协同过滤算法的电商平台推荐系统

    目录 前言 课题背景和意义 实现技术思路 一 文献综述 二 基于用户协同过滤推荐系统算法 三 实证分析 四 总结 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计
  • mysql DATE_FORMAT导致索引失效

    最近在优化一个统计的接口 在几十万的数据统计下 接口处理的响应时间达到了20s 看了下代码逻辑 发现其中主要有三个主要的统计方法 在优化了其中一个方法的统计逻辑后 接口的响应时间下降到了3s内 还是没有达到期望的响应时间 1s内 看了下另外
  • 决策树——依据水果特征分类

    文章目录 一 获取数据集 1 提取数据 2 划分数据 二 计算信息增益 1 信息熵 2 计算信息增益 三 绘制决策树 四 分类预测 一 获取数据集 水果中苹果和杨桃外部特征比较鲜明 例如下面两张苹果 杨桃图片 苹果颜色为红色 形状大致为椭圆
  • 优化代码逻辑之 K-近邻算法之鸢尾花实例 使用Spark实现KNN的Demo2

    这篇代码是KNN的优化 代码就是 flatMap里面的结构转换 和aggregate的应用感觉有点难理解 但是思想简单 首先要知道这个优化是基于 有个大数据的思想 分而治之 求出一份数据最大的前一百个数 如果数据太多 内存太小 则将数据切割
  • AndroidStudio AIDL 示例代码详细步骤

    AIDL Android Interface Definition Language 即Android接口定义语言 最近在看Binder的原理 Android里面AIDL就是Binder的经典实现 先记录一下AIDL的使用步骤 1 服务端S
  • 神奇的master公式(递归行为时间复杂度)

    master master公式是干嘛的呀 master公式是干嘛的呀 master是一个对于递归行为时间复杂度的估算 公式为 T N a T N b O N d 不用急我们来举一个栗子 我们先来看看二分法求最大值的代码 public int
  • 疯狂的程序员--绝影

    该博客转自新浪博客 作者 疯狂之桥 网址 http blog sina cn dpool blog s blog a46817ff010157cf html vt 4 今天看到绝影的CSDN博客由于种种原因被关闭了 心中有种说不出的感觉 感
  • python爬虫(一)

    目录 前言 一 爬虫简介 1 1 Python爬虫 1 2 robots协议 二 爬虫分类 2 1 通用网络爬虫 2 2 垂直网络爬虫 2 3 增量式网络爬虫 2 4 分布式网络爬虫 2 5 深度网络爬虫 2 6 搜索引擎爬虫 三 爬虫构造
  • [学习交流] OC学习笔记之id类型及应用场景

    1 NSObject访问子类方法 NSObject是所有类的基类 可以指向任何子类 例如 import