OC语言自学《十二》---- OC(Foundation框架部分知识总结)
2014-04-09 11:47
555 查看
NSRange
表示一个范围主要用来操作字符串
代码示例:
<!-- lang: cpp --> //NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。 //定义如下 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; //NSUInteger的本质时unsigned long类型 typedef unsigned long NSUInteger; NSRange range = NSMakeRange(2,4); //需要记住的创建范围方式 NSString *str = @"i love oc"; //NSString的对象方法rangeOfString查找某个字符串在str中的范围 NSRange range1 = [str rangeOfString:@"ve o"]; //ve o在str字符串中的范围 4 4 //如果找不到,location=NSNoFound=-1,length=0, NSRange range2 = [str rangeOfString:@"java"]; NSLog(@"\nlocation=%ld,length=%ld",range1.location,range1.length);
CGPoint、NSPoint
通过设置x坐标和y坐标来设置某个点IOS设备的x和y从左上角开始,y值往下面增加,x值往右面增加
代码示例:
<!-- lang: cpp --> //NSPoint和CGPoint相等 CGPoint p1 = NSMakePoint(30, 40); CGPoint p2 = CGPointMake(10, 10); //开发中这个最常用 //CGPointZero代表x和y坐标都为0-----(0,0) CGPoint p3 = CGPointZero; //NSPoint的本质是CGPoint typedef CGPoint NSPoint; //CGPoint的本质 struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; //比较两个点是否相同(x、y) BOOL result1 = CGPointEqualToPoint(CGPointZero, CGPointMake(1, 0)); //0
CGSize、NSSize
表示一个矩形尺寸,宽高代码示例
<!-- lang: cpp --> //创建了两个矩形,s1的宽是100,高是60 CGSize s1 = CGSizeMake(100, 60); NSSize s2 = NSMakeSize(100, 50); CGSize s3 = CGSizeZero; //CGSize的本质 struct CGSize { CGFloat width; CGFloat height; }; typedef struct CGSize CGSize; //比较两个尺寸是否相同 BOOL result2 = CGSizeEqualToSize(CGSizeZero, CGSizeMake(0, 0)); //1
CGRect、NSRect
CGRect包含了一个按钮在手机屏幕上的位置,和按钮本身的宽和高代码示例:
<!-- lang: cpp --> //Rect的本质 struct CGRect { CGPoint origin; CGSize size; }; typedef struct CGRect CGRect; NSPoint p1 = CGPointMake(10, 10); CGSize s3 = NSMakeSize(200, 60); //创建了一个Rect CGRect c1 = {p1, s1}; //将结构体转换成字符串 NSString *str = NSStringFromPoint(p1); NSString *str2 = NSStringFromSize(s1); NSString *str3 = NSStringFromRect(r1); //然后打印 NSLog(@"Point=%@,NSSize=%@,NSRect=%@",str,str2,str3); //多种Rect的创建方式 CGRect c2 = {CGPointZero,CGSizeMake(100, 90)}; CGRect c3 = {CGPointMake(10, 10),CGSizeZero}; CGRect c4 = {{10,20},{200,100}}; //比较两个Rect是否相同 BOOL result3 = CGRectEqualToRect(c2, c3); //判断一个矩形中是否包含某个点,包含返回YES(1),不包含返回NO(0) BOOL result = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(100, 70)); //YES(1) //将结构体转换成字符串,方便打印 NSString *str = NSStringFromPoint(p1); NSString *str2 = NSStringFromSize(s1); NSString *str3 = NSStringFromRect(r1); NSLog(@"Point=%@,NSSize=%@,NSRect=%@",str,str2,str3);
NSString(不可变字符串)
字符串创建(initWithFormat)
<!-- lang: cpp --> NSString *str1 = @"Something string.."; NSString *str3 = [[NSString alloc]initWithFormat:@"age is %d",10];
OC字符串和C字符串之间的转换
<!-- lang: cpp --> // C字符串 -》 OC字符串 NSString *str4 = [[NSString alloc] initWithUTF8String:"jack"]; // OC字符串 -》 C字符串 const char *str5= [str4 UTF8String];
从文件或URL创建字符串
<!-- lang: cpp --> //URL:资源路径 //协议头://路径 //file:// //ftp:// //http://weibo.com/a.jpg //推荐用URL //也可以抓取网页的内容,比如www.baidu.com首页 //创建一个URL,只要是URL就必须指定好协议头 NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/guankunluo/Desktop/1.txt"]; //从文件读取,并创建字符串str6 NSString *s = @"/Users/guankunluo/Desktop/1.txt"; NSString *str6 = [[NSString alloc]initWithContentsOfFile:s encoding:NSUTF8StringEncoding error:nil]; //将字符串转换为file协议的地址 NSURL *url2 = [NSURL fileURLWithPath:@"/Users/guankunluo/Desktop/1.txt"]; //从URL读取内容,并创建新的字符串str7 NSString *str7 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
把字符串写入到文件(- writeToFile、 - writeToURL)
<!-- lang: cpp --> //把字符串写入到文件 NSString *path = @"/Users/guankunluo/Desktop/2.txt"; //加入\n来代表换行 [@"Jack \n Jack" writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil]; //把字符串写入到URL NSURL *url = [NSURL URLWithString:@"file:///Users/guankunluo/Desktop/2.txt"]; [@"lalalalala" writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSMutableString(可变字符串)
创建一个可变的字符串
<!-- lang: cpp --> //创建一个NSMutableString,可变 NSMutableString *str1 =[NSMutableString stringWithFormat:@"age is %d",10];
拼接字符串
<!-- lang: cpp --> //拼接内容到str1的结尾处,无返回值 [str1 appendString:@" 11 12"];
删除字符串
<!-- lang: cpp --> //根据范围把字符串中is删除,但是str1的字符串改变,范围也就改变了,所以不好 //[str1 deleteCharactersInRange:NSMakeRange(4,2)]; //应该根据rangeOfString方法先找出is的范围 NSRange range = [str1 rangeOfString:@"is"]; //然后在把取得的范围传入删除字符串方法的参数中,这样以后再改变也会随之改变范围 [str1 deleteCharactersInRange:range];
NSArray(有序不可变集合)
集合只能存放OC对象,不能存放基本类型创建NSArray
<!-- lang: cpp --> //集合只能存放OC对象,不能存放基本类型 //创建只有1个集合,并设置一个元素 NSArray *array01 = [NSArray arrayWithObject:@"abc"]; //nil时集合元素的结束标记,不能删除 //集合中也不能定义nil元素 //NSArray *array02 = [NSArray arrayWithObjects:@"abc",@"def", nil]; //不推荐 NSArray *array02 = @[@"abc",@"def"]; //推荐
获取NSArray的长度
<!-- lang: cpp --> //[array02 count]; //array02.count 返回的是unsigned long NSLog(@"%ld",array02.count);
访问集合
<!-- lang: cpp --> NSLog(@"%@",[array02 objectAtIndex:1]); //不推荐 NSLog(@"%@",array02[1]); //推荐
NSMutableArray(有序可变集合)
创建可变集合
<!-- lang: cpp --> //创建一个可变的空集合 NSMutableArray *array = [NSMutableArray array]; //初始化可变集合时,添加元素 NSMutableArray *array2 = [NSMutableArray arrayWithObjects: @"sss", @"aaa", @"bbb", nil]; //错误,@[]返回的时NSArray,所以不能用@[]创建可变集合NSMutableArray //NSMutableArray *array3 = @[@"dd",@"dsd",@"dsd"];
添加元素
<!-- lang: cpp --> //给可变集合添加元素 [array addObject:[[Person alloc] init]]; [array addObject:@"jack"];
删除元素
<!-- lang: cpp --> //删除所有元素 [array2 removeAllObjects]; //删除指定元素 [array2 removeObject:@"aaa"]; //删除指定索引的元素 [array2 removeObjectAtIndex:1]; //删除最后一个元素 [array2 removeLastObject];
NSSet和NSMutableSet(无序不可变集合和可变集合)
NSSet 和 NSArray的对比共同点:
1.都是集合,都能存放多个OC对象
2.只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、float等、结构体、枚举)
3.都有一个可变的子类,本身不可变
不同点:
1.NSArray有顺序,NSSet无顺序
NSSet
<!-- lang: cpp --> //错误,没有意义,创建了一个空的set集合,而且Set是不可变的 //NSSet *s = [NSSet set]; NSSet *s = [NSSet setWithObjects: @"aaa", @"bbb", @"ccc", @"ddd", nil]; //由于NSSet是无序的,所以只能随机取出元素 //随机取出元素 NSString *str = [s anyObject];
NSMutableSet
<!-- lang: cpp --> NSMutableSet *s = [NSMutableSet set]; //添加元素 [s addObject:@"hack"]; [s addObject:@"haha"]; //删除所有元素 [s removeAllObjects]; //删除指定元素 [s removeObject:@"haha"];
NSDictionary和NSMutableDictionary(可变和不可变的字典集合)
字典:相当于java中的map字典是无序的
key—-》value
索引—-》文字内容
Dictionary中存储的是键值对
Dictionary中的key不能重复,value可以重复
NSDictionary(不可变字典集合)
<!-- lang: cpp --> //NSDictionary---不可变的字典、无序的 //创建了一个字典,但是只存储了一个键值对 NSDictionary *dict = [NSDictionary dictionaryWithObject:@"luoguankun" forKey:@"name"]; //通过key获取value NSString *name = [dict objectForKey:@"name"]; NSLog(@"%@",name); //luoguankun //推荐这样访问字典中的value id obj = dict[@"name"]; //通过传入2个不可变数组NSArray来初始化Dictionary字典集合 NSArray *key = @[@"name",@"address"]; NSArray *value = @[@"罗冠坤",@"北京"]; NSDictionary *dict2 = [NSDictionary dictionaryWithObjects:value forKeys:key]; //如果传入的key没有找到,就返回null,不报错 NSLog(@"%@",[dict2 objectForKey:@"address"]); //北京 //下面的写法可读性很差 NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys: @"luoguankun",@"name", @"北京",@"address",nil]; //推荐使用这种方式初始化创建字典 NSDictionary *dict4 = @{@"name": @"luoguankun",@"address": @"北京"}; //返回键值对的个数,不是key+value的个数 int count = dict4.count;
NSMutableDictionary(可变字典集合)
<!-- lang: cpp --> //错误!@{}返回不可变的Dictionary //NSMutableDictionary *dict = @{@"name",@"luoguankun"}; NSMutableDictionary *dict = [NSMutableDictionary dictionary]; //添加键值对 [dict setObject:@"luoguankun" forKey:@"name"]; [dict setObject:@"北京" forKey:@"address"]; //当设置了重复的key时,会覆盖以前的,所以dictionary中的key是唯一的,value可以重复 [dict setObject:@"luo" forKey:@"name"]; NSLog(@"%@",dict[@"name"]); //luo //删除某个key所指向的键值对 [dict removeObjectForKey:@"address"];
Dictionary字典集合的遍历
<!-- lang: cpp --> NSDictionary *dict = @{@"name": @"luoguankun",@"address":@"北京"}; //通过for循环遍历NSDictionary,不推荐 NSArray *keys = [dict allKeys]; for (int i = 0; i < keys.count ; i++) { NSString *value = [dict objectForKey:keys[i]]; NSLog(@"%@---%@",keys[i],value); } //推荐使用这种遍历方式,通过block遍历集合 [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { NSLog(@"%@-%@",key,obj); //打印一次就停止 *stop = YES; }];
遍历集合
方式一(for)
<!-- lang: cpp --> //NSArray快速遍历 NSArray *array1 = @[@"a",@"b",@"c",@"d",@"f",@"g"]; //普通的for循环 for(int i = 0; i < array.count; i++) { NSLog(@"%@",array[i]); }
方式二(for in)
<!-- lang: cpp --> //很像java中的foreach //id obj 代表着集合中的每一个元素 for(id obj in array1) { //找出obj元素在数组中的位置 unsigned long i = [array1 indexOfObject:obj]; NSLog(@"%ld=%@",i,obj); }
方式三(block)推荐
<!-- lang: cpp --> // 每遍历到一个元素,就会调用一次block // 并且把当前元素和索引位置当做参数传给block // stop的作用相当于break,终止循环 // 设置为YES,就停止循环 //obj代表当前元素对象 //idx代表元素下标 [array1 enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"%ld = %@", idx,obj); if(idx == 2) { *stop = YES; } } ]; //block遍历集合的本质 void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *step) { NSLog(@"%ld - %@", idx, obj); if (idx == 2) { //停止遍历 *step = YES; } }; for (int i = 0; i < array1.count; i++) { //用来标记是否需要停止遍历 BOOL isStop = NO; //取出元素 id obj = array1[i]; myblock(obj, i, &isStop); if (isStop) { break; } }
练习—计算代码行数
<!-- lang: cpp --> #import <Foundation/Foundation.h> NSUInteger codeLineCount(NSString *); /* 考察NSString、NSArray的使用 NSFileManager */ int main(int argc, const char * argv[]) { /* 分割字符串 NSString *str = @"jack-rose- jim-jake"; NSArray *array = [str componentsSeparatedByString:@"-"]; [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"%@",obj); }]; */ NSUInteger count = codeLineCount(@"/Users/guankunluo/Documents/C_Files/"); NSLog(@"该路径下所有文件共计:%ld行",count); return 0; } /* path:文件全路径 返回值:代码行数 */ NSUInteger codeLineCount(NSString *filePath) { //1.获取文件管理者,它是单例类 NSFileManager *mgr = [NSFileManager defaultManager]; //2.判断path是文件夹还是文件路径,返回BOOL BOOL dir = NO; //用来标记是否为文件夹 //这个路径是否存在,等于是返回了两个值,一个是方法返回值,一个是传进去的dir BOOL exist = [mgr fileExistsAtPath:filePath isDirectory:&dir]; //这个方法会改变dir,因为传得是地址 //3.如果路径不存在,就直接返回0 if (!exist) { NSLog(@"路径不存在"); return 0; } int count = 0; //说明路径存在 //判断是一个文件夹,还是是一个文件 if (dir) { //NSLog(@"是一个文件夹"); //装着当前文件夹下的所有内容(文件夹、文件) NSArray *array = [mgr contentsOfDirectoryAtPath:filePath error:nil]; //打印出文件夹中的文件列表 //NSLog(@"%@",array); //根据文件列表,拼接出全路径 for (NSString *filename in array) { NSString *fullPath = [NSString stringWithFormat:@"%@%@",filePath,filename]; count += codeLineCount(fullPath); } } else { //NSLog(@"是一个文件"); //4.获取文件的拓展名,并且转换成小写 NSString *extension = [[filePath pathExtension] lowercaseString]; if (![extension isEqualToString:@"h"] && ![extension isEqualToString:@"m"] && ![extension isEqualToString:@"c"]) { //代表文件拓展名,不是m,也不是h,也不是c return 0; } //加载文件内容 NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; //按指定字符串,分割字符串,返回集合 NSArray *array = [content componentsSeparatedByString:@"\n"]; //控制输出的内容,把根路径换掉 NSRange range = [filePath rangeOfString:@"/Users/guankunluo/Documents/C_Files/"]; //替换字符串 NSString *str = [filePath stringByReplacingCharactersInRange:range withString:@""]; NSLog(@"%@-%ld",str,array.count); return array.count; } return count; }
相关文章推荐
- OC(Foundation框架部分知识总结)
- 黑马程序员————OC中Foundation框架知识总结
- OC语言自学基础知识总结
- OC语言自学《十一》---- OC(内存管理知识总结)
- OC中Foundation框架知识总结
- OC语言自学《十》---- OC(构造函数、分类等知识总结)
- OC语言自学《十一》---- OC(内存管理知识总结)
- 黑马程序员--Objective-C语言基础知识--Foundation框架的常见用法
- 黑马程序员——OC语言加强---Foundation框架介绍
- [黑马程序员]14[OC语言]OC内存管理部分学习笔记总结
- 黑马程序员————Foundation框架_知识总结(上)
- 黑马程序员_OC_FOUNDATION框架总结
- 【IOS 开发学习总结-OC-29】★★objective-c之foundation 框架——(集合类)数组
- 黑马程序员-OC语言-Foundation框架(听课笔记)
- 黑马程序员—OC语言基础—Foundation框架小结
- 【IOS 开发学习总结-OC-25】★★★objective-c——foundation 框架之字符串
- 黑马程序员-OC语言-Foundation框架中的常用结构体
- Oc语言一些基础知识总结
- 黑马程序员-OC语言基础:Foundation框架小结
- Android Multimedia框架总结(十二)CodeC部分之OMXCodec与OMX事件回调流程