Objective-C基础夯实篇——NSValue&NSNumber(装箱和拆箱)

概述



NSNumber和NSValue都是用来做装箱用的,把基本类型的数据装成对象。官方文档给的资料说明地很清楚:

/*	NSValue.h
	Copyright (c) 1994-2014, Apple Inc. All rights reserved.
*/

#import <Foundation/NSObject.h>

@class NSString, NSDictionary;

@interface NSValue : NSObject <NSCopying, NSSecureCoding>

- (void)getValue:(void *)value;
@property (readonly) const char *objCType NS_RETURNS_INNER_POINTER;

- (instancetype)initWithBytes:(const void *)value objCType:(const char *)type NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

@end

@interface NSValue (NSValueCreation)

+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
+ (NSValue *)value:(const void *)value withObjCType:(const char *)type;

@end

@interface NSValue (NSValueExtensionMethods)

+ (NSValue *)valueWithNonretainedObject:(id)anObject;
@property (nonatomic, readonly) id nonretainedObjectValue;

+ (NSValue *)valueWithPointer:(const void *)pointer;
- (void *)pointerValue;

- (BOOL)isEqualToValue:(NSValue *)value;

@end

@interface NSNumber : NSValue

- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithChar:(char)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedChar:(unsigned char)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithShort:(short)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedShort:(unsigned short)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithInt:(int)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedInt:(unsigned int)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithLong:(long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedLong:(unsigned long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithLongLong:(long long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedLongLong:(unsigned long long)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithFloat:(float)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithDouble:(double)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithBool:(BOOL)value NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;
- (NSNumber *)initWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0) NS_DESIGNATED_INITIALIZER;

@property (readonly) char charValue;
@property (readonly) unsigned char unsignedCharValue;
@property (readonly) short shortValue;
@property (readonly) unsigned short unsignedShortValue;
@property (readonly) int intValue;
@property (readonly) unsigned int unsignedIntValue;
@property (readonly) long longValue;
@property (readonly) unsigned long unsignedLongValue;
@property (readonly) long long longLongValue;
@property (readonly) unsigned long long unsignedLongLongValue;
@property (readonly) float floatValue;
@property (readonly) double doubleValue;
@property (readonly) BOOL boolValue;
@property (readonly) NSInteger integerValue NS_AVAILABLE(10_5, 2_0);
@property (readonly) NSUInteger unsignedIntegerValue NS_AVAILABLE(10_5, 2_0);

@property (readonly, copy) NSString *stringValue;

- (NSComparisonResult)compare:(NSNumber *)otherNumber;

- (BOOL)isEqualToNumber:(NSNumber *)number;

- (NSString *)descriptionWithLocale:(id)locale;

@end

@interface NSNumber (NSNumberCreation)

+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
+ (NSNumber *)numberWithShort:(short)value;
+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
+ (NSNumber *)numberWithLong:(long)value;
+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
+ (NSNumber *)numberWithLongLong:(long long)value;
+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
+ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);

@end

本文主要内容如下:

  1.文档说明

2.测试程序

文档说明



NSNumber是继承自NSValue的。NSValue可以装任意值,NSNumber主要用于处理我们常用的基本数据类型。NSValue的用法还需要待学习深入。

NSNumber有快速语法:使用@     比如@YES 就可以封装成对象了。具体在测试程序中有说明。

测试程序


//
//  main.m
//  NSNumber&NSValue
//
//  Created by hushunfengMac-CMCC on 15/7/8.
//  Copyright (c) 2015年 hushunfengMac-CMCC. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSNumber *intNum = [NSNumber numberWithInt:10];
        int i = intNum.intValue;
        NSLog(@"%d",i);

        //快速语法
        NSNumber *boolNum = @YES;
        BOOL x = boolNum.boolValue;
        BOOL y = [boolNum boolValue];

        NSLog(@"%i",x);
        NSLog(@"%i",y);

        //NSLog(@"Hello, World!");
    }
    return 0;
}
时间: 2024-11-07 10:13:07

Objective-C基础夯实篇——NSValue&NSNumber(装箱和拆箱)的相关文章

C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析

前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆箱,是优化程序提高效率的一种途径.不仅跬步,无以至千里,不积小流,无以至江河.优化从点点滴滴做起. 一.装箱拆箱概念: 这里是官方定义:http://msdn.microsoft.com/zh-cn/library/yz2be5wk.aspx 装箱:值类型→引用类型 拆箱:引用类型→值类型 二.为什

Java基础之包装类的自动装箱和拆箱详解

定义 在java中,数据类型可以分为两大类,即基本数据类型和引用数据类型,基本数据类型的数据不是对象,所以对于要将数据类型作为对象来使用的情况,java提供了相对应的包装类.(关于包装类的详细介绍请参看博客Java基础之常用类详解) 本篇博客主要讲述包装类的自动装箱和拆行机制. 所谓装箱,就是把基本数据类型用它们相对应的引用类型包起来,使它们可以具有对象的特质,如我们可以把int类型包装成Integer类型的对象,或者把double包装秤Double,等等. 所谓拆箱,就是和装箱的方向相反,将I

温习.net基础知识(二)装箱和拆箱

内存机制 数据在内存中分配位置取决与该变量的数据类型,上图可知值类型分配在线程的堆栈上,引用类型则分配在托管堆上,由GC控制回收,以下代码和图演示了引用类型和值类型的区别: private static class ReferenceVsValue {       // Reference type (because of 'class')       private class SomeRef { public Int32 x; } // Value type (because of 'str

Objective-C基础夯实篇——导航

1.Objective-C基础夯实篇——集合的基本使用 2.Objective-C基础夯实篇——NSValue&NSNumber(装箱和拆箱)

Objective-C基础夯实篇——集合的基本使用

概述 本基础夯实篇为本人学习iOS开发中的对基本语法知识的总结系列,不打算刨根问底,只求实用.本文夯实的内容是开发过程中经常要用到的集合类,由于缺乏项目经验,先对自认为经常会用到的一些基本语法做个总结. 本文主要内容如下: 1.NSArray 2.NSMutableArray NSArray 1.创建:常用的两种方法为如下形式.很需要注意的是:不同于Java,OC中的NSArray中的元素可以是不同的对象类型. id obj1 = [[NSObject alloc]init]; id obj2

一、基础篇--1.1Java基础-包装类的装箱和拆箱

包装类:java是典型的面向对象编程,但是八种基本数据类型并不支持面向对象编程.基本类型的数据不具备对象的特性,没有属性和方法.沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单.有效地进行常规数据处理. 但是,这种非面向对象的做法也会带来不便,因此,java为每种基本数据类型分别设计了对应的类,称为包装类. 基本数据类型以及对用的包装类的关系如下: byte Byte short Short int Integer long Long char Char float Float double

java基础第十一篇之Date、Math、自动装箱和拆箱

Date类 表示一个瞬间,就是一个时刻 * * 构造方法: * public Date();//创建一个表示当前系统时间的Date对象 * public Date(long time);//毫秒值,距离标准时间(1970.1.1 0点0点0秒)的毫秒值 * * 成员方法: * long getTime();//获取当前日期对象(Date对象)距离标准时间的毫秒值 * * 毫秒值--->Date对象:public Date(long time) * Date对象---->毫秒值 :long ge

C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C#提供一下几种方式: 1.Query.String方式 2.Server.Transfer方式 3.Cookie方式 4.Session方式 5.Application方式 (2)实现方式 新建TestTransfer项目,添加TransferOne.aspx页面和TransferTwo.aspx页

Java基础——深入剖析Java中的装箱和拆箱

(转自:http://www.cnblogs.com/dolphin0520/p/3780005.html) 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题  一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器