------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;
}
|