签到
Home
Android
iOS
C++
Article
Hackintosh
搜索
登录
注册
IOS开发中id类型的学习
Home
/
Article
MrLee
2014-11-27
3198
1. id foo1;2. NSObject *foo2;3. id
foo3;
第一种是最常用的,它简单地申明了指向对象的指针,没有给编译器任何类型信息,因此,编译器不会做类型检查。但也因为是这样,你可以发送任何信息给id类型的对象。这就是为什么+alloc返回id类型,但调用[[Foo alloc] init]不会产生编译错误。
因此,id类型是运行时的动态类型,编译器无法知道它的真实类型,即使你发送一个id类型没有的方法,也不会产生编译警告。
我们知道,id类型是一个Objective-C对象,但并不是都指向继承自NSOjbect的对象,即使这个类型和NSObject对象有很多共同的方法,像retain和release。要让编译器知道这个类继承自NSObject,一种解决办法就是像第2种那样,使用NSObject静态类型,当你发送NSObject没有的方法,像length或者count时,编译器就会给出警告。这也意味着,你可以安全地使用像retain,release,description这些方法。
因此,申明一个通用的NSObject对象指针和你在其它语言里做的类似,像java,但其它语言有一定的限制,没有像Objective-C这样灵活。并不是所有的Foundation/Cocoa对象都继承息NSObject,比如NSProxy就不从NSObject继承,所以你无法使用NSObject*指向这个对象,即使NSProxy对象有release和retain这样的通用方法。为了解决这个问题,这时候,你就需要一个指向拥有NSObject方法对象的指针,这就是第3种申明的使用情景。
id
告诉编译器,你不关心对象是什么类型,但它必须遵守NSObject协议(protocol),编译器就能保证所有赋值给id
类型的对象都遵守NSObject协议(protocol)。这样的指针可以指向任何NSObject对象,因为NSObject对象遵守NSObject协议(protocol),而且,它也可以用来保存NSProxy对象,因为它也遵守NSObject协议(protocol)。这是非常强大,方便且灵活,你不用关心对象是什么类型,而只关心它实现了哪些方法。
现在你知道你要用什么类型了不?
如果你不需要任何的类型检查,使用id,它经常作为返回类型,也经常用于申明代理(delegate)类型。因为代理类型通常在运行时,才会检查是否实现了那些方法。
如果真的需要编译器检查,那你就考虑使用第2种或者第3种。很少看到NSObject*能正常运行,但id
无法正常运行的。使用协议(protocol)的优点是,它能指向NSProxy对象,而更常用的情况是,你只想知道某个对象遵守了哪个协议,而不用关心它是什么类型。
id 还可以表示基础类型,但是不能表示float,double类型 NSObject *foo2; 如果使用这种形式,用到的时候需要强制类型转换。
本文链接:
https://www.it72.com/344.htm
收藏
0
收藏的用户(
0
)
X
正在加载信息~
推荐阅读
什么是暗网?
多字符串转换宽字符串
N种内核注入DLL的思路及实现
中国人买车的十大傻逼行为,你中了几个?
WordPress终极加速方案,无需插件,页面执行提升到0.0x秒
仙剑奇侠传3d回合-PC端多开
CentOS VIM用法小结
WordPress设置文章仅允许特定用户阅读
Nodejs Error: Cannot find module 'express'
QQ手机浏览器“虫洞漏洞”挖掘分析全过程
最新回复
(
0
)
返回
站点信息
文章
2285
用户
1336
访客
9620321
每日一句
If you are ever in trouble, don't try to be brave, just run, just run away.
你若遇上麻烦,不要逞强,你就跑,远远跑开。
开发区块链的十大编程语言
Android高权限截图例子
TCP粘包,拆包及解决方法
MPAndroidChart标记控件MarkerView的使用方法
简历增值的7种方法
虚拟内存现在还有用吗?
CentOS下使用 svnsync迁移SVN代码库
OllyDbg中如何找出B模块中所有调用了A模块的C方法的地方
3D游戏调节游戏帧率
NAT内网穿透-很不错的文章
Thinkpad x1 Extreme黑苹果10.14.5安装完成
Android自定义蜂窝view
使用MyBatis_Generator生成Dto、Dao、Mapping
免费xiuno博客主题【最后更新:2019.5.20】
独家发布最新可用My-AutoPost——wordpress 采集器
C#实现后台最小化截图
仙剑奇侠传3d回合-PC端多开
如何在iPhone上移动多个应用程序
首发:Thinkpad T550黑苹果10.13.4安装教程
css样式之flex布局注意事项
Android屏幕共享及远程控制【免root】
MPAndroidChart曲线非连续改装笔记
ASUS TF810C平板电脑用U盘安装windows8.1系统
iOS上架全流程及IPV6问题
Android更新速度越来越快吗?
免ROOT实现模拟点击任意位置
新会员