---------------------- Java培训、.Net培训、Android培训、IOS培训、期待与您交流! ----------------------
OC已经有int,float,double...类型为什么还需要设计NSNumber呢?原因是很多集合类型如NSArray,NSDictionary等只能容纳OC对象对于一些类似于int的基本数据类型我们需要把它转化为OC对象才能被集合容纳,这就是NSNumber设计的目的。
#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; }
(1) 初始化 :
1) 对于 alloc 这种方式初始化 它们的 init 通常是 initWith( Int,Char,Double...),如果没有使用ARC一般使用手动释放内存.
2) 对于 numberWith 这种初始化方式除了 int 类型对应的是 numberWithInteger ,其他的通常都是 numberWith(Char,Double,Float...).这种初始化方式默认为autorelease,没有使用ARC一般用于autoreleasepool
(2) 取值 : 一般都是 (intergerValue,doubleValue...);
NSValue是用来包装C语言的一些数据类型,例如:double,float,struct(结构体),指针等,因此它比NSNumber还强大,NSNumber是NSValue的子类
@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
// 默认开启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; }
(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
// 默认启用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; }
---------------------- Java培训、.Net培训、Android培训、IOS培训、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net/heima