Objective-C @encode关键字

Objective-C中那些关键字 今天在网上看了一篇讲Objective-C关键字的文章,发现自己有一些关键字几乎没有用过,因此在此写文记录一下学习心得。 关于Objective-C中的关键字,在Steffen Itterheim的一篇博文中有不错的讲解,在Objective-C2.0中有一下关键字:@class @defs @protocol @required @optional @end @interface @public 阅读详情

最近一段时间比较忙,抽空看了一下设计模式(主要是看两本书,《大话设计模式》和《Objective-C编程之道:iOS设计模式解析》 );

研究了一下3D数学和opengl,开始学习cocos2D,感觉时间总是很零散,很不够用,所以很久都没有写blog了。闲话少扯,言归正传。

昨天被一个同事问到,如果把一些数(int ,BOOL类型等)封装到NSNumber对象中,而这些NSNumber类型的数据又再放到一个字典当中,循环字典元素,取出每一个NSNumber类型的对象,如何才能够知道NSNumber对象中放的是什么类型的数(int ,BOOL类型等)?


因为之前了解过,NSNumber是工厂方法设计模式使用的典范(NSNumber类是抽象父类,每一种数类型肯定会包含一个具体子类),所以我就想当然的以为,只要循环字典,取出每一个NSNumber对象,然后判断这个对象是不是具体子类(比如NSCFInteger,NSCFBoolean类型)就可以,类似代码如下:

[cpp]  view plain copy
  1. NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"key1",[NSNumber numberWithDouble:1.00f],@"key2",[NSNumber numberWithInt:1],@"key3",[NSNumber numberWithFloat:33.0f], @"key4", nil];  
  2.     for(NSString *key in dic){  
  3.         id value = [dic valueForKey:key];  
  4.         NSLog(@"value ==== %@",value);  
  5.         if([value isKindOfClass:[NSNumber class]]){  
  6.             if(value isKindOfClass:[NSCFBoolean Class]){  
  7.                 NSLog(@"key = %@的值类型为布尔类型");  
  8.             }  
  9.         }  
  10.     }  

写完测试代码之后,才发现苹果根本就没有把NSNumber抽象类的具体子类NSCFBoolean的API公布出来,那么怎么判断这些NSNumber对象中到底放的是什么数据类型呢?

经过翻阅资料之后,发现之前一直没有注意过的一个新的知识点:

@encode()

为了更好的互操作性,Objective-C 的数据类型,甚至自定义类型、函数或方法的元类型,都可以使用 ASCII 编码。@encode(aType) 可以返回该类型的 C 字符串(char *)的表示


有了这个知识点,就可以很方便的判断NSNumber中存的到底是什么数据类型了大笑,下面是测试代码:

[cpp]  view plain copy
  1. NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"key1",[NSNumber numberWithDouble:1.00f],@"key2",[NSNumber numberWithInt:1],@"key3",[NSNumber numberWithFloat:33.0f], @"key4", nil];  
  2.     for(NSString *key in dic){  
  3.         id value = [dic valueForKey:key];  
  4.         if([value isKindOfClass:[NSNumber class]]){  
  5.             const char * pObjCType = [((NSNumber*)value) objCType];  
  6.             if (strcmp(pObjCType, @encode(int))  == 0) {  
  7.                 NSLog(@"字典中key=%@的值是int类型,值为%d",key,[value intValue]);  
  8.             }  
  9.             if (strcmp(pObjCType, @encode(float)) == 0) {  
  10.                 NSLog(@"字典中key=%@的值是float类型,值为%f",key,[value floatValue]);  
  11.             }  
  12.             if (strcmp(pObjCType, @encode(double))  == 0) {  
  13.                 NSLog(@"字典中key=%@的值是double类型,值为%f",key,[value doubleValue]);  
  14.             }  
  15.             if (strcmp(pObjCType, @encode(BOOL)) == 0) {  
  16.                 NSLog(@"字典中key=%@的值是bool类型,值为%i",key,[value boolValue]);  
  17.             }  
  18.         }  
  19.   
  20.     }  

UE4虚拟现实实习总结---蓝图中的常用交互事件|人物行走|物体移动|动态触发|材质改变 这周是ue4实习周,老师给我们的任务就是基于中学物理和化学实验的虚拟实验室,要有交互事件,后期可以链接vr手柄进行操作。 但是实习开始老师影都没了,全靠自己学习。感觉自己学习了不少东西,这里就来总结一下!顺便感叹一下,ue4好玩又强大! 以下主要介绍蓝图中的几种交互事件1.新建游戏角色并且进行角色行走旋转,2.如何控制物体移动旋转,3.如何控制物体材质动态变化 大家可以举一反三,作出更好的作品 1.新建游戏角色并且进行角色行走旋转 步骤 在刚刚新建的文件夹中鼠标右击新建蓝图类,然后分别创建以下:chara 阅读详情

相关推荐

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1920

@encode编译器指令和Objective-C类型编码介绍

@encode、Objective-C类型编码和方法编码

痴_Pro的博客 2095

UFS Link Startup全流程解析:从硬件初始化到链路稳定的5个关键阶段

本文详细解析了UFS Link Startup的全流程,从硬件初始化到链路稳定的5个关键阶段,包括初始化阶段、数据通道发现、数据通道重新对齐、链路启动收尾和能力交换阶段。通过时序分析、代码实现和实际案例,帮助开发者掌握UFS协议链路启动的技术细节,确保设备与主机之间的可靠通信。

weixin_30687051的博客 431

手把手教你用单结晶体管搭建简易振荡电路(含电路图和波形分析)

本文详细介绍了如何使用单结晶体管(UJT)搭建简易振荡电路,包括电路设计、波形分析和实战技巧。通过具体的电路图和参数计算,帮助电子爱好者和工程师快速掌握UJT振荡器的设计与调试方法,适用于脉冲信号生成和时钟源制作等应用场景。

weixin_29207533的博客 516

使用GitLab的VS Code插件 GitLab Workflow 来进行项目的DevOps管理,助力研发效能

使用VS Code的GitLab Workflow插件,进行项目的DevOps管理,将效率提升到MAX。直接在VScode中管理流水线,一键跳转到创建 Issues,MR

知无涯 5294

Objective-C中@encode的使用

今天看Mansonry的代码时,碰到一个生僻的关键字(也许只是自己没用过)。:-) @encode => 将给定类型编码为内部表示的字符串。 为了方便自己查阅,顺便也写个小例子,贴在这里,实践出真知嘛。 NSLog(@"UIViewController : %s", @encode(UIViewController)); NSLog(@"CGRect :...

weixin_34233421的博客 156

uniapp [全端兼容] - 详细实现下拉筛选菜单功能组件,下拉式筛选菜单效果,类似电商美团点击筛选项底部弹出列表点击选择后自动收起(详细示例代码,全端兼容小程序、安卓苹果app、h5网页、nvue

uni-app,vue2,vue3,向下弹出菜单包含筛选功能,日期筛选,下拉框选择器,下拉多条件筛选,下拉式筛选菜单,uniApp如何实现条件下拉筛选,Uniapp官方条件筛选组件,下拉框式条件筛选插件组件,最好用的插件组件,多端兼容,下拉菜单筛选,过滤筛选列表,下拉筛选栏,多列联动的条件筛选,下拉菜单地区和筛选,微信小程序,支付宝小程序,h5网页,移动端网站,安卓app,苹果app,nvue,uniapp所有平台兼容,下拉菜单筛选,下拉式条件筛选,下拉列表,点击排序,级联筛选,uniapp实现下拉筛选

🏆 前端领域优质创作者 1万+

Objective-C之@encode关键字

参考资料:yhawaii的专栏       个人笔记  感谢博主!@encode()为了更好的互操作性,Objective-C 的数据类型,甚至自定义类型、函数或方法的元类型,都可以使用 ASCII 编码。@encode(aType) 可以返回该类型的 C 字符串(char *)的表示。我们知道我们可以在程序中可以用OC对象 isKindOfClass:([OC类名 Class])方法来判断某个对

Code_Ninja 1529

【腾讯小龙虾 WorkBuddy 专栏 03】技能(Skills)制作全教程!自定义技能编写、导出分享、导入使用一步到位

🔥腾讯AI智能体WorkBuddy自定义技能全攻略 本文为零基础用户提供WorkBuddy自定义技能的完整教程,涵盖技能概念、编写规范到实操全流程。核心内容包括: 技能本质:标准化任务指令模板,可固化重复操作流程 三大价值:一键执行重复任务/跨设备共享/降低使用门槛 实操演示:以"桌面文档自动分类"为例,分步讲解编写、测试、导出 共享方案:支持单技能/批量导出,通过任意渠道传输分享 导入指南:3秒完成他人技能加载,并提供常见问题解决方案 高阶优化:增加异常处理、版本管理等提升技能普适性

AI人人懂 2975

YOLOv11 热力图可视化全流程:从模型解释到科研论证,让检测结果“有理可看”

无论是科研中需要严谨的模型解释,还是工业里要高效的缺陷定位,这套方法都能让你在“模型黑箱”与“业务需求”之间架起一座可视化的桥梁。别再让模型决策“无据可依”——现在就动手生成你的第一幅热力图,让 YOLOv11 的每一次检测都“有理可看”,用可视化的力量推动你的 AI 研究与落地走向深入!某团队在论文中通过热力图对比,证明其改进的注意力模块可使模型对小目标的关注区域更精准,实验论证说服力提升 50%;工业质检场景下,热力图帮助工程师快速定位模型漏检缺陷的原因——原来是对某类缺陷的特征关注不足。

m0_71589036的博客 678

@encode 和 strcmp 关键字的用法

项目中经常有一个NSArray、NSDictionary 中需要存储不同的类型的数据的时候怎么办? 1. 可能常用的做法是写一个model,那不就保证类型都一样了嘛 2. 使用 @encode 关键字,先看一段代码 //转换为NSValue NSValue *value = [NSValue valueWithBytes:&locCoord objCType:@encode

songhongri的专栏 4172

【数据集5】土地利用类型数量预测数据LUH2

简介土地利用类型数量预测数据LUH2

WW、forever的博客 4548

类型编码 @encode

原文  http://swifter.tips/type-encode/ 主题 Objective-C Objective-C 中有一些很冷僻但是如果知道的话在特定情况下会很有用的关键字,比如说通过类型获取对应编码的 @encode就是其中之一。 在 Objective-C 中 @encode使用起来很简单,通过传入一个类型,我们就可以获取代表这个类型的编码 C 字符

逢个场,作个戏 524

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

@encode 的用法

使用 @encode 关键字,先看一段代码 //转换为NSValue NSValue *value = [NSValue valueWithBytes:&locCoord objCType:@encode(CLLocationCoordinate2D)]; //取值 CLLocationCoordinate2D coord; [value getValue:&coord]

u011230573的博客 1876

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

那些被遗漏的Objective-C保留字

Steffen Itterheim 是《Learn Iphone and Ipad Cocos2d Game Development》作者。cocos2d现在已成为iphone游戏开发中重要的开发框架之一。在 AppStore 上有超过 100 个游戏是基于 Cocos2D。其中 3 个进入过 TOP 10 的排名。 他在他的博客中总结了 objective...

mmdev 126

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: NSInvocation使用示例
下一篇: png图片结构分析与加密解密原理
trandy
博客等级 码龄17年 79粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值