签到
Home
Android
iOS
C++
Article
搜索
登录
注册
IOS开发中id类型的学习
Home
/
Article
MrLee
2014-11-27
3921
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; 如果使用这种形式,用到的时候需要强制类型转换。
本文链接:
http://it72.com/344.htm
收藏
0
收藏的用户(
0
)
X
正在加载信息~
推荐阅读
完美实现"变速齿轮"
微信小程序F2图表——Cannot read property 'source' of null
够快才畅快vivo X6—vivo评测
开源技术protobuf 简介与例子
关于Ollydbg插件StrongOD出错的问题
小学课堂上,女老师的裤子拉链开了。
女:看你人不错的,公交车上你会给老奶奶让座吗?
Moto X深度评测
linux(centos)搭建SVN服务器
Google Play商城将85款恶意App下架
最新回复
(
0
)
返回
站点信息
文章
2313
用户
1336
访客
11685158
每日一句
Do small things greatly.
把小事做到伟大。
【教程】雷电模拟器udp接收包设置
如何在2020年获得理想的工作-战略路线图!
语法错误: 意外的令牌“标识符”
Duilib背景图片平铺
Android更新速度越来越快吗?
Android判断模拟器还是真机
一篇非常不错的xposed插件教程
关于百度网盘155010解决方法
eclipse工程基于Xposed的一个简单Hook
Notepad++如何代码格式化——NppAStyle
NDK19c Clang交叉编译arm64-v8a、armeabi-v7a架构下Boost
简单利用Clover四叶草安装U盘安装黑苹果
Pycharm配置OpenCV
免费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实现模拟点击任意位置
新会员