黑马程序员——Foundation(NSNumber,NSDate,NSValue)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1. NSNumber

a. NSNumber设计目的

OC已经有int,float,double...类型为什么还需要设计NSNumber呢?原因是很多集合类型如NSArray,NSDictionary等只能容纳OC对象对于一些类似于int的基本数据类型我们需要把它转化为OC对象才能被集合容纳,这就是NSNumber设计的目的。

b. NSNumber的使用


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

    #import<Foundation/Foundation.h>

    

    int main()

    {

        // 一般的初始化

        NSNumber *num = [[NSNumber alloc] initWithInt:10];

        NSLog("num = %d",num);

        [num release];

        

        @autoreleasepool{

            // 创建integer类型对象

            NSNumber *intNum = [NSNumber numberWithInteger:123];

            NSLog("intNum = %i",[intNum integerValue]);

            

            // 创建long类型对象

            NSNumber *longNum = [NSNumber numberWithLong:0xabcab];

            NSLog("longNum = %lx",longNum);

            

            // 创建float类型对象

            NSNumber *floatNum = [NSNumber numberWithFloat:123.0];

            NSLog("floatNum = %f",floatNum);

            

            // 创建double类型对象

            NSNumber *doubleNum = [NSNumber numberWithDouble:123e+10];

            NSLog("doubleNum = %lg",doubleNum);

            

            // 创建char类型对象 

            NSNumber *charNum = [NSNumber numberWithChar:‘c‘];

            NSLog("charNum = %c",charNum);

            

            NSNumber *myNum = [NSNumber numberWithFloat:123.0];

            

            // 大小对比 NSOrderedAscending  升序

            if ( [intNum compare:myNum] == NSOrderedAscending ){

                NSLog("左边的数比较大");

            else {

                NSLog("右边的数比较大");

            }

        }

        return 0;

    }

c. 规律

(1) 初始化 :

1) 对于 alloc 这种方式初始化 它们的 init 通常是 initWith( Int,Char,Double...),如果没有使用ARC一般使用手动释放内存.

2) 对于 numberWith 这种初始化方式除了 int 类型对应的是 numberWithInteger ,其他的通常都是 numberWith(Char,Double,Float...).这种初始化方式默认为autorelease,没有使用ARC一般用于autoreleasepool

(2) 取值 : 一般都是 (intergerValue,doubleValue...);

2. NSValue

a. 设计目的

NSValue是用来包装C语言的一些数据类型,例如:double,float,struct(结构体),指针等,因此它比NSNumber还强大,NSNumber是NSValue的子类


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

    @interface NSValue (NSValueUIGeometryExtensions)   

        

    + (NSValue *)valueWithPointer:(const void *)pointer;                             // 保存对象指针   

        

    + (NSValue *)valueWithCGPoint:(CGPoint)point;                                    // 保存CGPoint结构体   

    + (NSValue *)valueWithCGSize:(CGSize)size;                                       // 保存CGSize结构体   

    + (NSValue *)valueWithCGRect:(CGRect)rect;                                       // 保存CGRect结构体   

    + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;   

    + (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets;   

        

    - (void *)pointerValue;   

    - (CGPoint)CGPointValue;   

    - (CGSize)CGSizeValue;   

    - (CGRect)CGRectValue;   

    - (CGAffineTransform)CGAffineTransformValue;   

    - (UIEdgeInsets)UIEdgeInsetsValue;   

        

    @end

b. 使用

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

// 默认开启ARC

#import <Foundation/Foundation.h>

typedef struct{

    int age;

    char *name;

} Student;

int main(int argc, const char * argv[]) {

    @autoreleasepool {

 

    /***************************** 结构体包装 ******************************/

        Student s;

        s.age = 22;

        s.name = "mike";

        // 包装结构体

        /*

          [NSValue value:<#(const void *)#> withObjCType:<#(const char *)#>]

           参数1 : 目标结构体地址

           参数2 : 结构体的类型,它必须使用编译器的@endcode指令来创建

                   @encode(结构体类型,但不能使用C语言字符串作为硬编码作为参数)

         */

        NSValue *value = [NSValue valueWithBytes:&s objCType:@encode(Student)];

        

        // 结构体获取

        Student temp;

        [value getValue:&temp];

        // NSLog(@"name is %s ,age is %d",temp.name,temp.age);

     /***************************** 基本数据类型包装 ******************************/

        int a =10;

        NSValue *intValue = [NSValue valueWithBytes:&a objCType:@encode(int)];

        int tempA;

        [intValue getValue:&tempA];

        NSLog(@" a = %d",tempA);

    /***************************** CGPoint包装 ******************************/

        // CGPoint包装

        CGPoint point = CGPointMake(10, 20);

        NSValue *pValue = [NSValue valueWithPoint:point];

        

        // CGPoint获取

        CGPoint pTemp = [pValue pointValue];

        NSLog(@"x = %f ,y = %f",pTemp.x,pTemp.y);

        

    /***************************** 指针包装 ******************************/

        // 指针包装

        /*

            + (NSValue *)valueWithPointer:(const void *)aPointer

            等价于

            NSValue *theValue = [NSValue value:&aPointer withObjCType:@encode(void *)];

         */

        Student *studentP = &s;

       NSValue *pointValue1 = [NSValue valueWithPointer:studentP];

       Student *pointTemp = [pointValue1 pointerValue];

       NSLog(@"pointTemp->age = %d ,pointTemp->name = %s",pointTemp->age,pointTemp->name);

    }

    return 0;

}

3. NSDate

a. 简介

(1) NSDate是用来获取时间的,但IOS中NSDate默认打印出来的是0时区(格林威治标准时间GMT)的时间

(2) 如果想显示北京时间(东八区),还要做时区转换

(3) NSDate是以秒为单位的

(4) NSDate通常被NSDateFormatter格式化之后才能输出显示,常用格式如下:

字母       日期或时间元素                     表示                示例

y           年                                       Year               1996; 96

M          年中的月份                            Month            July; Jul; 07

w          年中的周数                            Number          27

W         月份中的周数                          Number          2

D          年中的天数                            Number          189

d          月份中的天数                          Number          10

F          月份中的星期                          Number          2

E          星期中的天数                          Text               Tuesday; Tue

a          Am/pm 标记                          Text                PM

H          一天中的小时数(0-23)           Number           0

k          一天中的小时数(1-24)            Number           24

K          am/pm 中的小时数(0-11)      Number           0

h          am/pm 中的小时数(1-12)      Number           12

m         小时中的分钟数                        Number           30

s          分钟中的秒数                           Number           55

b. 使用


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

// 默认启用ARC

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // NSDate 的初始化,默认是取的是0时区的时间

        // NSDate *date0 = [[NSDate alloc] init];

        NSDate *date0 = [NSDate date];

        // 默认打印的是0时区的时间

        // NSLog(@"%@",date0);

        // date0 8秒钟之后的时间

        // typedef double NSTimeInterval;

        NSDate *date8 = [NSDate dateWithTimeInterval:8 sinceDate:date0];

        // 1970年到现在到现在的秒数

        NSTimeInterval sencondsSince1970 = [date0 timeIntervalSince1970];

        // 获取24小时之前此时刻的时间 : 昨天的这个时刻相差(秒) : -(24 * 60 * 60)

        NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:-(24 * 60 * 60)];

 

        

        // NSDateFormatter的初始化

        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

        // 设置显示格式

        formatter.dateFormat = @"yyyy - MM - dd : HH:mm:ss";

        

        // 获取0时区的时间字符串

        NSString *dateStr0 = [formatter stringFromDate:date0];

        // 获取8秒钟之后东八区的时间字符串

        NSString *dateStr8 = [formatter stringFromDate:date8];

        // 获取昨天当前时间的格式化字符串

        NSString *yesterdayStr = [formatter stringFromDate:yesterday];

        

        NSLog(@"系统当前时间 : %@",dateStr0);

        NSLog(@"8秒钟之前的时间 : %@",dateStr8);

        NSLog(@"昨天此时时间 : %@",yesterdayStr);

        

        NSLog(@"1970年到现在到现在的秒数 = %lf",sencondsSince1970);

    }

    return 0;

}

时间: 2024-11-10 08:02:16

黑马程序员——Foundation(NSNumber,NSDate,NSValue)的相关文章

黑马程序员——Foundation学习笔记(NSSet和NSMutableSet)

==========android培训.ios培训.java培训.期待与您交流========== 一.NSSet: NSSet NSSet里面存储的元素没有顺序,NSArray中的元素有顺序. NSSet *s = [NSSet set]; // 创建一个空的Set,永远是空,不可变. NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose",nil]; NSString *str = [s2 anyObject]; //

黑马程序员--Foundation框架之--类其他常用的类:NSNumber,NSDate

------IOS培训期待与您交流! ------- Foundation的其他常用的类:NSNumber,NSDate 一.NSNumber 这个类主要是用来封装基本类型的,OC 中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去. 从这一点上我们就可以看出NSNumber是很重要的,后面一定会经常用到. 1.封包和解包 // 创建NSNumber // 封包 NSNumber *intNumber = [NSNumber numberWithI

黑马程序员------Foundation框架中各种牛瓣数据类型

-----iOS培训.Android培训.Java培训,期待与您交流----- 一.NSRange.NSPoint\CGPoint. NSSize\CGSize.NSRect\CGRect (CGPint CGSize)结构体 1)NSRange NSRange表示一个范围,比如我们想求个@"I fall in love with Objective-C~";  这个字符串中"love"的表示范围就是位置从11开始,长度为4: NSRange的本质是一个结构体, 里

黑马程序员——Foundation框架常用类(NSNumber/NSValue)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 简介 引入:NSArray.NSSet.NSDictionary这些OC集合都只能存放OC对象,不能存放基本数据类型(int.char.double...).如果我们想将基本数据类型存到这些OC集合中,那么我们将基本数据类型(int.char.double...)包装成OC对象,那么就可以存到OC集合中.NSNumber可以将基本数据类型包装为OC对象. NSValue:用来存储一个C或者OC的

黑马程序员——Foundation框架常用类(NSDate)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 简介 NSDate:用于保存时间值的一个OC类,同时提供了一些方法来处理一些与时间相关的事.NSDate对象用来表示一个具体的时间点.NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体.NSDate存储的是GMT时间,使用的时候会根据 当前应用 指定的 时区 进行时间上的增减,以供计算或显示. NSDate 1.时间对象的基本使用 //第一种创建方式(里面存储

黑马程序员——Foundation框架的小总结

一.Foundation框架—结构体 一.基本知识 Foundation框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框架中的数据类型,那么包含它的主头文件就可以了.即#import<foundation/foundation.h> 补充:core foundation框架相对底层,里面的代码几乎都是c语言的,而foundation中是OC的. 二.常用的结构体介绍及简单使用 常用的结构体: (一)NSRang的基本使用

黑马程序员--Foundation框架之--NSArray类以及它的子类NSMutableArray类

今天我们继续来看一下Foundation框架中的NSArray类和 NSMutableArray类,NSArray类 是不可变的,NSMutableArray类是可变的. 一.NSArray类 NSArray中不可以存放基本数据类型,只能存放类的实例,如果需要将基本类型.结构体放入到数组中得话,需要通过NSNumber/NSValue进行数据的封装 同时不能在NSArray中存储nil // // main.m // 16_NSArray // // Created by waterfoxjie

黑马程序员--Foundation框架之--NSObject类

OC中的Foundation框架是系统提供的,他就相当于是系统的一套api,其内部有很多现有的类和功能提供给我们使用. 那么今天首先来介绍一下Foundation框架中的第一个类NSObject. // // Person.h // 13_NSObjectMethod // // Created by waterfoxjie 15-03-31. // Copyright (c) 2015年 waterfoxjie. All rights reserved. // #import <Foundat

黑马程序员-Foundation框架之数组和字典

一.Foundation框架简介 Foundation框架,顾名思义就是基础框架.基础框架上的类都是与用户界面无关的,为所有的程序开发提供一个基础.OC的基础框架常用的类包括:数组,字典,数字,字符串等以及它们的子类.要使用这个框架需要在引入头文件#import <Foundation/Foundation.h> 二.数组 NSArray类以及它的子类NSMutableArray,一个是不可变数组,一个是可变数组.下面通过代码来看一下它的一些基本的用法. 1 #import <Found