Foundation框架中的NSNumber对象详解
到目前为止,我们所讨论过的所有数字数据类型,如int型、float型和long型都是Objective-C语言中的基本数据类型,也就是说,它们都不是对象。例如,不能向它们发送消息。然而,有时需要作为对象使用这些值。例如,使用Foundation的对象NSArray,可以设置一个用于存储值的数组。这些值必须是对象,因此不能将任何基本数据类型直接存储到这些数组中。要存储任何基本数据类型(包括char数据类型),可以使用NSNumber类根据这些数据类型来创建对象。
一般来说,无须担心需要释放Foundation方法返回的对象。有时候,对象由返回它的方法所拥有。其他情况下,对象是由方法新创建的并被添加到自动释放池中。第一部分中讲过,使用完用alloc方法显式地创建的任何对象(包括Foundation对象)之后,仍然需要释放它们。
回到上面的代码, NSNumber类包含多个方法,它们允许使用初始值创建NSNumber对象。例如,程序行:
|
1
|
intNumber |
创建了一个值为100的整数对象。
从NSNumber对象获得的值必须和存储在其中的值类型一致。因此,在程序中该语句之后的printf语句中,消息表达式:
|
1
|
[intNumber |
检索存储在intNumber中的整型值,并将其存储在NSInteger变量myInt中。注意,NSInteger不是一个对象,而是基本数据类型的typedef。它被typedef成64位的long或者32位的int。存在一个类似的NSInteger typedef用于处理程序中那些未签名的整数。
在NSLog调用中,将NSInteger转换为long并使用格式字符%li,以确保值可以传递并正确显示,即使程序编译后是32位架构的。
对于每个基本值,类方法都为它分配了一个NSNumber对象,并将其设置为指定的值。这些方法以numberWith开始,之后是该方法的类型,如numberWithLong:、numberWithFloat:等。此外,可以使用实例方法为以前分配的NSNumber对象设置指定的值。这些都是以initWith开头的,如initWithLong:和initWithFloat:。
下表列出了为NSNumber对象设置值的类和实例方法,以及检索这些值的相应实例方法。
| 创建和初始化类的方法 | 初始化实例方法 | 检索实例方法 |
| numberWithChar: | initWithChar: | charValue |
| numberWithUnsignedChar: | initWithUnsignedChar: | unsignedCharValue |
| numberWithShort: | initWithShort: | shortValue |
| numberWithUnsignedShort: | initWithUnsignedShort: | unsignedShortValue |
| numberWithInteger: | initWithInteger: | integerValue |
| numberWithUnsignedInteger: | initWithUnsignedInteger: | unsignedIntegerValue |
| numberWithInt: | initWithInt: | intValueunsigned |
| numberWithUnsignedInt: | initWithUnsignedInt: | unsignedIntValue |
| numberWithLong: | initWithLong: | longValue |
| numberWithUnsignedLong: | initWithUnsignedLong: | unsignedLongValue |
| numberWithLongLong: | initWithLongLong: | longlongValue |
| numberWithUnsignedLongLong: | initWithUnsignedLongLong: | unsignedLongLongValue |
| numberWithFloat: | initWithFloat: | floatValue |
| numberWithDouble: | initWithDouble: | doubleValue |
| numberWithBool: | initWithBool: | boolValue |
再回到代码,该程序接下来使用类方法创建了long,char,float和double NSNumber对象。注意,使用程序行
|
1
|
myNumber |
创建double对象后将出现什么情况?然后尝试(不正确地)使用如下程序行来检索并显示它的值:
|
1
|
NSLog |
将得到以下输出:
|
1
|
0 |
并且,系统也没有给出出错消息。一般来说,你负责确保正确地进行检索,如果在NSNumber对象中存储了一个值,那么也要用一致的方式进行检索。
在if语句中,消息表达式
|
1
|
[intNumber |
使用isEqualToNumber:方法根据数值比较两个NSNumber对象。该程序测试返回的Boolean值,以查看这两个值是否相等。
可用compare:方法来测试一个数值型的值是否在数值上小于、等于或大于另一个值。消息表达式
|
1
|
[intNumber |
在intNumber中的值小于myNumber中的值时,返回值NSOrderedAscending;如果这两个数相等,则返回值NSOrderedSame;如果第一个值大于第二个值,则返回值NSOrderedDescending。在头文件NSObject.h中已经定义了这些返回值。
应该注意不能重新初始化前面创建的NSNumber对象的值。例如,不能使用下面的语句设置存储在NSNumber对象myNumber中的整数:
|
1
|
[myNumber |
当程序执行时,这条语句将产生一条错误。所有数字对象都必须是新创建的,这意味着必须对NSNumber类调用上表第一列列出一个方法,或者对alloc方法的结果调用第二列列出的方法中,如下所示:
|
1
|
myNumber |
当然,基于前面的讨论,如果使用这种方式创建myNumber,则在使用完之后,你需要使用以下语句来释放它:
|
1
|
[myNumber |
好了,到这里,Foundation框架中的NSNumber对象就介绍完了。
Foundation框架中的NSNumber对象详解的更多相关文章
- JS中的event 对象详解
JS中的event 对象详解 JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...
- (转载)OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
在之前的一篇文章中我们说到了Foundation框架中的NSObject对象,那么今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString. 在OC中 ...
- (转载)OC学习篇之---Foundation框架中的NSObject对象
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...
- OC学习篇之---Foundation框架中的NSString对象和NSMutableString对象
今天在在来继续看一下Foundation框架中的常用对象:NSString和NSMutableString 在OC中NSString对象是不可变的,和Java中的String一样的,而NSMutabl ...
- OC学习篇之---Foundation框架中的NSObject对象
从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...
- Laravel框架中的make方法详解
为什么网上已经有这么多的介绍Laravel的执行流程了,Laravel的容器详解了,Laravel的特性了,Laravel的启动过程了之类的文章,我还要来再分享呢? 因为,每个人的思维方式和方向是不一 ...
- Ajax中的XMLHttpRequest对象详解
XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...
- Ajax中的XMLHttpRequest对象详解(转)
XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...
- Django框架中auth模块的详解
auth模块 auth模块是对登录认证方法的一种封装,本身就是一个对象,可以获取用户的详细信息,有了auth模块可以验证登录信息是否存在数据库中,还可以检验用户是否已经登录,校验密码等 auth方法 ...
随机推荐
- 一个事件激活多个JavaScript函数
http://www.cnblogs.com/meil/archive/2006/09/20/509359.html如果你的网页中一个“OnLoad”事件要激活两个以上的JavaScript函数,那怎 ...
- Windows服务操作之sc和net命令及windows任务计划
看个粟子: 1.“新建项目”——“Window服务” 生成的目录结构 双击“MainService.cs”,右键点击“添加安装程序”,自动会生成Projectinstaller.cs文件以及两个安装组 ...
- jQuery常用方法一览及JQuery选择器获取表格中按钮所在行的其他列值
Attribute: $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式$(”img”).attr({src:”test.jpg”,alt:”test Image”}); ...
- ansible 提示安装sshpass
之前用ansible一直用的root身份.机器之间又早早的做好了ssh信任.所以一直也没有出现什么问题.今天想想自己不能这么浪了,还是用回普通用户吧: 然而马上就遇到了第一个问题,ansible提示安 ...
- MySQL主从双向同步复制
本文介绍了mysql主从,实现mysql的双向同步复制. MySQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护日 ...
- Spring Cloud(九):分布式配置中心和消息总线
我们在Spring Cloud(七):使用SVN存储分布式配置中心文件和实现refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码 ...
- zend server 和zend studio 最佳实践
1.zend server 安装好后需要重启下.无论是win还是mac..win不重启组件不能用.mac 不重启守护进程是离线的 2.修改apache配置.的根目录.到zendstudio的工作空间 ...
- dependent-name ‘xxx::yyy’ is parsed as a non-type, but instantiation yields a type
简言之,就是说你该用typename的地方没用typename,如以下代码 template<class Cont> void frontInsertion(Cont& ci) { ...
- lua工具库penlight--04路径和目录
使用路径 程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植.最糟糕的是硬编码的路径, windows和Unix的路径分隔符正好相反.最好使用path.join,它可以帮助你解决这个问题. pl ...
- 2.重学javascript 对象和数组
什么是对象,其实就是一种类型,即引用类型. 一.创建Object类型有两种. ①使用new运算符 <script type="text/javascript"> var ...