Foundation概述
为什么前面说的内容中新建一个类的时候我们都是选择Cocoa Class呢?Cocoa是什么呢?
Cocoa不是一种编程语言(它可以运行多种编程语言),它也不是一个开发工具(通过命令行我们仍然可以开发Cocoa程序),它是创建Mac OS X和IOS程序的原生面向对象API,为这两者应用提供了编程环境。
我们通常称为“Cocoa框架”,事实上Cocoa本身是一个框架的集合,它包含了众多子框架,其中最重要的要数“Foundation”和“UIKit”。前者是框架的基础,和界面无关,其中包含了大量常用的API;后者是基础的UI类库,以后我们在IOS开发中会经常用到。这两个框架在系统中的位置如下图:
其实所有的Mac OS X和IOS程序都是由大量的对象构成,而这些对象的根对象都是NSObject,NSObject就处在Foundation框架之中,具体的类结构如下:
通常我们会将他们分为几类:
1.值对象
2.集合
3.操作系统服务:文件系统、URL、进程通讯
4.通知
5.归档和序列化
6.表达式和条件判断
7.Objective-C语言服务
UIKit主要用于界面构架,这里我们不妨也看一下它的类结构:
常用结构体
NSRange表示一个范围
NSRange rg={3,5};//第一参数是起始位置,第二个参数是长度
//NSRange rg;
//rg.location=3;
//rg.length=5;
//NSRange rg={.location=3,.length=5};
//常用下面的方式定义 NSRange rg2=NSMakeRange(3,5);//使用NSMakeRange定义一个NSRange
//打印NSRange可以使用Foundation中方法 NSLog(@"rg2 is %@", NSStringFromRange(rg2));//注意不能直接NSLog(@"rg2 is %@", rg2),因为rg2不是对象(准确的说%@是指针)而是结构体
NSPoint表示一个点
NSPoint p=NSMakePoint(10, 15);//NSPoint其实就是CGPoint
NSPoint p2=CGPointMake(10, 15);//这种方式比较常见
NSSize表示大小
NSSize s=NSMakeSize(10, 15);//NSSize其实就是CGSize
CGSize s2=CGSizeMake(10, 15);//这种方式比较常见
NSRect表示一个矩形
NSRect r=NSMakeRect(10, 5, 100, 200);//NSRect其实就是CGRect
NSRect r2=CGRectMake(10, 5, 100, 200);//这种方式比较常见
日期
NSDate *date1=[NSDate date];//获得当前日期
NSLog(@"%@",date1); //结果:2014-07-16 07:25:28 +0000
NSDate *date2=[NSDate dateWithTimeIntervalSinceNow:100];//在当前日期的基础上加上100秒,注意在ObjC中多数时间单位都是秒
NSLog(@"%@",date2); //结果:2014-07-16 07:27:08 +0000
NSDate *date3=[NSDate distantFuture];//随机获取一个将来的日期
NSLog(@"%@",date3); //结果:4001-01-01 00:00:00 +0000
NSTimeInterval time=[date2 timeIntervalSinceDate:date1];//日期之差,返回单位为秒
NSLog(@"%f",time); //结果:100.008833
NSDate *date5=[date1 earlierDate:date3];//返回比较早的日期
NSLog(@"%@",date5); //结果:2014-07-16 07:25:28 +0000
//日期格式化
NSDateFormatter *formater1=[[NSDateFormatter alloc]init];
formater1.dateFormat=@"yy-MM-dd HH:mm:ss";
NSString *datestr1=[formater1 stringFromDate:date1];
NSLog(@"%@",datestr1); //结果:14-07-16 15:25:28
//字符串转化为日期
NSDate *date6=[formater1 dateFromString:@"14-02-14 11:07:16"];
NSLog(@"%@",date6); //结果:2014-02-14 03:07:16 +0000
字符串
不可变字符串
在ObjC中字符串操作要比在C语言中简单的多,在下面的例子中你将看到字符串的初始化、大小写转化、后缀前缀判断、字符串比较、字符串截取、字符串转换等,通过下面的例子我们基本可以掌握常用的字符串操作(注意这些内容虽然基本,但却是十分常用的操作,需要牢记):
初始化
/**字符串操作*/
char *str1="C string";//这是C语言创建的字符串
NSString *str2=@"OC string";//ObjC字符串需要加@,并且这种方式创建的对象不需要自己释放内存
//下面的创建方法都应该释放内存 非ARC下
NSString *str3=[[NSString alloc] init];
str3=@"OC string";
NSString *str4=[[NSString alloc] initWithString:@"Objective-C string"];
NSString *str5=[[NSString alloc] initWithFormat:@"age is %i,name is %.2f",19,1.72f];
NSString *str6=[[NSString alloc] initWithUTF8String:"C string"];//C语言的字符串转换为ObjC字符串
//以上方法都有对应静态方法(一般以string开头),不需要管理内存(系统静态方法一般都是自动释放)
NSString *str7=[NSString stringWithString:@"Objective-C string"];
全部变大写
NSLog(@"\"Hello world!\" to upper is %@",[@"Hello world!" uppercaseString]);
//结果:"Hello world!" to upper is HELLO WORLD!
全部小写
NSLog(@"\"Hello world!\" to lowwer is %@",[@"Hello world!" lowercaseString]);
//结果:"Hello world!" to lower is hello world!
首字母大写,其他字母小写
NSLog(@"\"Hello world!\" to capitalize is %@",[@"Hello world!" capitalizedString]);
//结果:"Hello world!" to capitalize is Hello World!
字符串比较
BOOL result= [@"abc" isEqualToString:@"aBc"];
NSLog(@"%i",result);
//结果:0
NSComparisonResult result2= [@"abc" compare:@"aBc"];
//如果是[@"abc" caseInsensitiveCompare:@"aBc"]则忽略大小写比较
if(result2==NSOrderedAscending){
NSLog(@"left<right.");
}else if(result2==NSOrderedDescending){
NSLog(@"left>right.");
}else if(result2==NSOrderedSame){
NSLog(@"left=right.");
}
//结果:left>right.
字符串查询
//检查前缀
NSLog(@"has prefix ab? %i",[@"abcdef" hasPrefix:@"ab"]);
//结果:has prefix ab? 1
//检查后缀
NSLog(@"has suffix ab? %i",[@"abcdef" hasSuffix:@"ef"]);
//结果:has suffix ab? 1
NSRange range=[@"abcdefabcdef" rangeOfString:@"code"];
//注意如果遇到cde则不再往后面搜索,如果从后面搜索或其他搜索方式可以设置第二个options参数
if(range.location==NSNotFound){
NSLog(@"not found.");
}else{
NSLog(@"range is %@",NSStringFromRange(range));
}
//结果:range is {2, 3}
字符串分割
//从第三个索引开始(包括第三个索引对应的字符)截取到最后一位
NSLog(@"%@",[@"abcdef" substringFromIndex:3]);
//结果:def
//从0开始截取到第三个索引(不包括第三个索引对应的字符)
NSLog(@"%@",[@"abcdef" substringToIndex:3]);
//结果:abc
//从2开始 长度为3
NSLog(@"%@",[@"abcdef" substringWithRange:NSMakeRange(2, 3)]);
//结果:cde
//使用特殊字符分割字符串为数组
NSString *str1=@"12.abcd.3a";
NSArray *array1=[str1 componentsSeparatedByString:@"."];//字符串分割
NSLog(@"%@",array1);
/*结果:
(
12,
abcd,
3a
)
其他操作
//类型转换
NSLog(@"%i",[@"12" intValue]);
//结果:12
//字符串长度注意不是字节数
NSLog(@"%zi",[@"hello world,世界你好!" length]);
//结果:17
//取出制定位置的字符
NSLog(@"%c",[@"abc" characterAtIndex:0]);
//结果:a
//转换为C语言字符串
const char *s=[@"abc" UTF8String];
NSLog(@"%s",s);
//结果:abc
扩展--文件操作
//路径操作
NSMutableArray *marray=[NSMutableArray array];//可变数组
[marray addObject:@"Users"];
[marray addObject:@"cccccc"];
[marray addObject:@"Desktop"];
NSString *path=[NSString pathWithComponents:marray];
NSLog(@"%@",path);//字符串拼接成路径
//结果:Users/cccccc/Desktop
NSLog(@"%@",[path pathComponents]);//路径分割成数组
/*结果:
(
Users,
cccccc,
Desktop
)
*/
NSLog(@"%i",[path isAbsolutePath]);//是否绝对路径(其实就是看字符串是否以“/”开头)
//结果:0
NSLog(@"%@",[path lastPathComponent]);//取得最后一个目录
//结果:Desktop
NSLog(@"%@",[path stringByDeletingLastPathComponent]);//删除最后一个目录,注意path本身是常量不会被修改,只是返回一个新字符串
//结果:Users/cccccc
NSLog(@"%@",[path stringByAppendingPathComponent:@"Documents"]);//路径拼接
//结果:Users/cccccc/Desktop/Documents
//扩展名操作
NSString *path=@"Users/cccccc/Desktop/test.txt";
NSLog(@"%@",[path pathExtension]);//取得扩展名,注意ObjC中扩展名不包括"."
//结果:txt
NSLog(@"%@",[path stringByDeletingPathExtension]);//删除扩展名,注意包含"."
//结果:Users/cccccc/Desktop/test
NSLog(@"%@",[@"Users/cccccc/Desktop/test" stringByAppendingPathExtension:@"mp3"]);//添加扩展名
//结果:Users/cccccc/Desktop/test.mp3
}