黑马程序员————OC中Foundation框架知识总结
2015-03-19 14:11
507 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一个框架(Framework)就是一个软件包,它包含多个类。Mac 操作系统提供了几十个框架,从而帮助软件开发人员迅速地在Mac 系统上开发应用程序。在这些框架中,有一
些称为基础框架。基础框架就是为了所有程序开发提供基础的框架,其中的类包括:字符串(NSString)、数字(NSNumber)、数组(NSArray)、字典(NSDictionary)、
集合(NSSet)等,所有的基础框架上的类都同用户界面无关,也不是用来构筑用户界面。这也是区分基础框架和非基础框架的区别。
我们在学基础的时候,经常是写这样的语句:
#import <Foundation/Foundation.h>
我们也可以导入我们要使用的类的头文件:
#import <Foundation/NSString.h>
OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用。那
么今天首先来介绍一下Foundation框架中的第一个类NSObject
在之前介绍了类的相关知识,我们看到我们自定义的类都必须实现NSObject类,这个类内部有很多现有的方法可以供我们使用,比如我们经常使用的alloc和init方法,就是
NSObject提供的,下面就在来看一下他的一些其他常用方法:
NSString(不可变字符串)
字符串创建(initWithFormat)
isEqual方法:
他的作用就是判断两个指针变量是否指向同一个对象,在OC中他还有一个简单的用法,就是直接使用"=="来进行比较,这两个效果是一样的,但是在Java中是不同的,Java中
的"=="是判断两个引用变量是否指向同一个对象,但是其equals方法是判断两个对象的值是否相等(这里的值指的是基本类型,其他对象类型,可以重写这个方法来进行操作)。
respondsToSelector方法:
这个方法我们在之前的文章中使用过了,他的作用就是判断一个类中是否有某个方法,他的判断是只要这个方法有实现,就返回YES
如果只在.h文件中定义了,没有在.m文件中实现的话,也是返回NO的
如果这个方法没有在.h文件中定义,但是在.m文件中有实现的话(私有方法),返回YES
只要方法在.m文件中有才会返回YES
这个方法的功能如果在Java中可以使用反射去实现
performSelector方法:
这个方法的作用就是调用对象中的一个方法,看到上面的例子,这个方法有很多样式:
无参数样式
[self performSelector:@selector(demo1)]
一个参数的样式
//调用有一个参数的方法
[self performSelector:@selector(demo2:) withObject:@"jiangwei"];
两个参数样式
//调用有两个参数的方法
[self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
但是我们看到上面的调用方式,感觉不到这个方法的用途,因为我们完全可以直接调用demo1方法
[self demo1]
NSArray(有序不可变集合):
集合只能存放OC对象,不能存放基本类型
创建NSArray:
获取NSArray的长度
访问集合
NSMutableArray(有序可变集合):
创建可变集合
添加元素
删除元素
NSSet和NSMutableSet(无序不可变集合和可变集合):
NSSet 和 NSArray的对比
共同点:
1.都是集合,都能存放多个OC对象
2.只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、float等、结构体、枚举)
3.都有一个可变的子类,本身不可变
不同点:
1.NSArray有顺序,NSSet无顺序
NSSet:
[objc] view
plaincopy
/错误,没有意义,创建了一个空的set集合,而且Set是不可变的
//NSSet *s = [NSSet set];
NSSet *s = [NSSet setWithObjects: @"aaa", @"bbb", @"ccc", @"ddd", nil nil];
//由于NSSet是无序的,所以只能随机取出元素
//随机取出元素
NSString *str = [s anyObject];
NSMutableSet:
字典:相当于java中的map
字典是无序的
key—-》value
索引—-》文字内容
Dictionary中存储的是键值对
Dictionary中的key不能重复,value可以重复
NSDictionary(不可变字典集合):
NSMutableDictionary(可变字典集合):
Dictionary字典集合的遍历:
小例子:计算代码的行数:
一个框架(Framework)就是一个软件包,它包含多个类。Mac 操作系统提供了几十个框架,从而帮助软件开发人员迅速地在Mac 系统上开发应用程序。在这些框架中,有一
些称为基础框架。基础框架就是为了所有程序开发提供基础的框架,其中的类包括:字符串(NSString)、数字(NSNumber)、数组(NSArray)、字典(NSDictionary)、
集合(NSSet)等,所有的基础框架上的类都同用户界面无关,也不是用来构筑用户界面。这也是区分基础框架和非基础框架的区别。
我们在学基础的时候,经常是写这样的语句:
#import <Foundation/Foundation.h>
我们也可以导入我们要使用的类的头文件:
#import <Foundation/NSString.h>
OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现有的类和功能提供给我们使用。那
么今天首先来介绍一下Foundation框架中的第一个类NSObject
在之前介绍了类的相关知识,我们看到我们自定义的类都必须实现NSObject类,这个类内部有很多现有的方法可以供我们使用,比如我们经常使用的alloc和init方法,就是
NSObject提供的,下面就在来看一下他的一些其他常用方法:
NSString(不可变字符串)
字符串创建(initWithFormat)
NSString *str1 = @"Something string.."; NSString *str3 = [[NSString alloc]initWithFormat:@"age is %d",10];
isEqual方法:
//isEqual方法 NSObject *obj1 = [[NSObject alloc] init]; NSObject *obj2 = [[NSObject alloc] init]; if([obj1 isEqual:obj2]){ NSLog(@"obj1 == obj2"); }else{ NSLog(@"obj1 != obj2"); } //或者直接用等号判断 if(obj1 == obj2){ //do something... }else{ //do something... }
他的作用就是判断两个指针变量是否指向同一个对象,在OC中他还有一个简单的用法,就是直接使用"=="来进行比较,这两个效果是一样的,但是在Java中是不同的,Java中
的"=="是判断两个引用变量是否指向同一个对象,但是其equals方法是判断两个对象的值是否相等(这里的值指的是基本类型,其他对象类型,可以重写这个方法来进行操作)。
respondsToSelector方法:
//respondsToSelector方法 //判断类中是否有特定的方法(有实现的方法全部返回YES,如果只在.h文件中定义了,返回的是NO) //同时这种方式可以实现调用所谓的私有方法 Person *task = [[Person alloc] init]; isBelongTo = [task respondsToSelector:@selector(invoke)]; if(isBelongTo){ }else{ }
这个方法我们在之前的文章中使用过了,他的作用就是判断一个类中是否有某个方法,他的判断是只要这个方法有实现,就返回YES
如果只在.h文件中定义了,没有在.m文件中实现的话,也是返回NO的
如果这个方法没有在.h文件中定义,但是在.m文件中有实现的话(私有方法),返回YES
只要方法在.m文件中有才会返回YES
这个方法的功能如果在Java中可以使用反射去实现
performSelector方法:
- (void)invoke{ NSLog(@"invoke is Executing..."); [self demo1];//对象调用 //performSelector方法调用 NSString *result = [self performSelector:@selector(demo1)]; NSLog(@"%@",result); //调用有一个参数的方法 [self performSelector:@selector(demo2:) withObject:@"jiangwei"]; //调用有两个参数的方法 [self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"]; //延迟调用一个方法 //此处的延迟调用,代码不会停留在此处,为了不阻塞线程 [self performSelector:@selector(demo1) withObject:NULL afterDelay:2.5]; //如果没有以下代码的话,上面的延迟调用就不会有效果的,因为他不会阻塞当前线程,所以当前线程中后续的代码会继续执行 //在main.m中得main方法中,会直接return,这样程序就运行结束了,所以来不及执行2.5s之后方法执行 //以下代码让执行过程停在此处 [[NSRunLoop currentRunLoop] run]; } - (NSString *)demo1{ NSLog(@"demo1"); return @"demo1"; } - (void)demo2:(NSString *)str{ NSLog(@"str = %@",str); } - (void)demo3:(NSString *)str withName:(NSString *)name{ NSLog(@"str = %@,name = %@",str,name); }
这个方法的作用就是调用对象中的一个方法,看到上面的例子,这个方法有很多样式:
无参数样式
[self performSelector:@selector(demo1)]
一个参数的样式
//调用有一个参数的方法
[self performSelector:@selector(demo2:) withObject:@"jiangwei"];
两个参数样式
//调用有两个参数的方法
[self performSelector:@selector(demo3:withName:) withObject:@"jiangwei" withObject:@"man"];
但是我们看到上面的调用方式,感觉不到这个方法的用途,因为我们完全可以直接调用demo1方法
[self demo1]
NSArray(有序不可变集合):
集合只能存放OC对象,不能存放基本类型
创建NSArray:
//集合只能存放OC对象,不能存放基本类型 //创建只有1个集合,并设置一个元素 NSArray *array01 = [NSArray arrayWithObject:@"abc"]; //nil时集合元素的结束标记,不能删除 //集合中也不能定义nil元素 //NSArray *array02 = [NSArray arrayWithObjects:@"abc",@"def", nil]; //不推荐 NSArray *array02 = @[@"abc",@"def"]; //推荐
获取NSArray的长度
//[array02 count]; //array02.count 返回的是unsigned long NSLog(@"%ld",array02.count);
访问集合
NSLog(@"%@",[array02 objectAtIndex:1]); //不推荐 NSLog(@"%@",array02[1]); //推荐
NSMutableArray(有序可变集合):
创建可变集合
//创建一个可变的空集合 NSMutableArray *array = [NSMutableArray array]; //初始化可变集合时,添加元素 NSMutableArray *array2 = [NSMutableArray arrayWithObjects: @"sss", @"aaa", @"bbb", nil]; //错误,@[]返回的时NSArray,所以不能用@[]创建可变集合NSMutableArray //NSMutableArray *array3 = @[@"dd",@"dsd",@"dsd"];
添加元素
//给可变集合添加元素 [array addObject:[[Person alloc] init]]; [array addObject:@"jack"];
删除元素
//删除所有元素 [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:
[objc] view
plaincopy
/错误,没有意义,创建了一个空的set集合,而且Set是不可变的
//NSSet *s = [NSSet set];
NSSet *s = [NSSet setWithObjects: @"aaa", @"bbb", @"ccc", @"ddd", nil nil];
//由于NSSet是无序的,所以只能随机取出元素
//随机取出元素
NSString *str = [s anyObject];
NSMutableSet:
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(不可变字典集合):
//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(可变字典集合):
//错误!@{}返回不可变的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字典集合的遍历:
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; }];
小例子:计算代码的行数:
#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:@" "]; //控制输出的内容,把根路径换掉 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框架NSSArray用法总结
- OC(Foundation框架部分知识总结)
- ——黑马程序员——OC中Foundation框架NSString用法总结
- 黑马程序员————Foundation框架_知识总结(上)
- 黑马程序员-OC-Foundation框架总结一
- OC语言自学《十二》---- OC(Foundation框架部分知识总结)
- 黑马程序员_OC_FOUNDATION框架总结
- 黑马程序员————Foundation框架_知识总结(下)
- OC中Foundation框架知识总结
- 黑马程序员_OC_Foundation框架
- 黑马程序员_OC学习之Foundation框架2
- 黑马程序员_【总结】_集合框架知识梳理4_(end)
- 黑马程序员--Foundation框架总结
- 黑马程序员_java基础知识总结(3)集合框架
- 黑马程序员_Foundation框架基础知识(三)-常用类
- 黑马程序员----OC学习总结--Founation框架
- 黑马程序员--OC之Foundation框架
- 黑马程序员_OC之Foundation框架
- 黑马程序员——11、OC语言(Foundation框架的简单使用)
- 黑马程序员-IOS-OC基础-Foundation框架的简单使用