黑马程序员——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;
}

 

                    

转载于:https://www.cnblogs.com/qiang0901/p/4476515.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值