黑马程序员---Objective-C 学习笔记之三
来源:互联网 发布:web前端页面性能优化 编辑:程序博客网 时间:2024/05/06 12:32
protocol:
1. 协议的用途
1> 用来声明一大堆方法(不能声明成员变量)
2> 只有某个类遵守了这个协议,就相当于拥有了这个协议中的所有方法声明
3> 只要父类遵守了某个协议,就相当于子类业遵守了
2.协议的格式
@protocol 协议名称 <NSObject>
// 方法声明列表....
@end
3.如何遵守协议
1> 类遵守协议
@interface 类名 :父类名 <协议名称1,协议名称2>
// 方法声明列表....
@end
2> 协议遵守协议
@protocol 协议名称 <其他协议名称1,其他协议名称2>
// 方法声明列表....
@end
4.协议中方法声明的关键字
1> @required (默认)
要求实现,如果没有实现,会发出警告
2> @optional
不要求实现,怎样不会有警告
5.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称>变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
如果没有遵守对应的协议,编译器会警告
6.@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称>属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
7.协议可用定义在单独.h文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中
2> 如果这个协议用在很多类中,就应该定义在单独文件中
8.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法
block:
1> 如何定义block变量
int (^sumBlock)(int, int);
void (^myBlock)();
2> 如何利用block封装代码
^(int a, int b) {
return a - b;
};
^() {
NSLog(@"----------");
};
^ {
NSLog(@"----------");
};
3> block访问外面变量
* block内部可以访问外面的变量
* 默认情况下,block内部不能修改外面的局部变量
* 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4> 利用typedef定义block类型
typedef int (^MyBlock)(int, int);
// 以后就可以利用MyBlock这种类型来定义block变量
MyBlock block;
MyBlock b1, b2;
b1 = ^(int a, int b) {
return a - b;
};
MyBlock b3 = ^(int a, int b) {
return a - b;
};
文件:
1> 文件的遍历
// 1.获得文件管理者 NSFileManager *mgr = [NSFileManager defaultManager]; // 2.标记是否为文件夹 BOOL dir = NO; // 标记是否为文件夹 // 标记这个路径是否存在 BOOL exist = [mgr fileExistsAtPath:path isDirectory:&dir]; // 3.如果不存在,直接返回0 if(!exist) { NSLog(@"文件路径不存在!!!!!!"); return 0; } // 代码能来到着,说明路径存在 if (dir) { // 文件夹 // 获得当前文件夹path下面的所有内容(文件夹、文件) NSArray *array = [mgr contentsOfDirectoryAtPath:path error:nil]; // 定义一个变量保存path中所有文件的总行数 int count = 0; // 遍历数组中的所有子文件(夹)名 for (NSString *filename in array) { // 获得子文件(夹)的全路径 NSString *fullPath = [NSString stringWithFormat:@"%@/%@", path, filename]; // 对文件的操作 。。。。。。 } return count; } else { // 文件 // 判断文件的拓展名(忽略大小写) NSString *extension = [[path pathExtension] lowercaseString]; if (![extension isEqualToString:@"h"] && ![extension isEqualToString:@"m"] && ![extension isEqualToString:@"c"]) { // 文件拓展名不是h,而且也不是m,而且也不是c return 0; } // 加载文件内容 NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; // 将文件内容切割为每一行 NSArray *array = [content componentsSeparatedByString:@"\n"]; // 删掉文件路径前面的/Users/apple/Desktop/iOS课堂共享/0722课堂共享/ NSRange range = [path rangeOfString:@"/Users/apple/Desktop/iOS课堂共享/0722课堂共享/"]; NSString *str = [path stringByReplacingCharactersInRange:range withString:@""]; // 对文件的操作 。。。。。。 }
2> 创建目录
NSFileManager * fm = [NSFileManager defaultManager];NSError * error = nil;//当前路径指的是可执行程序的路径而不是代码的路径//创建目录 返回值:创建成功返回YES 失败返回NOBOOL ret = [fm createDirectoryAtPath:@"./hello2/world" //创建目录的路径 withIntermediateDirectories:YES//路径不存在是否创建目录 YES代表创建(会把不存在的目录也创建) NO代表不创建 attributes:nil //文件属性(权限),通常写nil代表默认权限 error:&error];if(ret){ NSLog(@"success!");}else{ NSLog(@"error = %@",error);}
3> 创建文件
NSFileManager * fm = [NSFileManager defaultManager];//创建文件BOOL ret = [fm createFileAtPath:@"./1.txt" //路径以及文件名 contents:nil //要创建的文件的内容 nil代表空文件 若文件以及存在会覆盖该文件 attributes:nil];[fm fileExistsAtPath:@“./1.txt”]//判断文件时候存在
4> 拷贝文件/目录
NSFileManager * fm = [NSFileManager defaultManager];NSError * error = nil;//拷贝文件/目录//第二个参数必须要写全文件或者目录名字BOOL ret = [fm copyItemAtPath:@"/Users/aaaaa/Desktop/string.c"//要复制的文件的路径 toPath:@"./1.txt" //目的文件(文件名不要加空格)若以及存在会返回 error error:&error];
5> 移动(重命名)文件/目录
//重命名(移动)文件或目录//重命名:就是修改文件路径//如果文件/目录存在 移动失败ret = [fm moveItemAtPath:@"/Users/aaaaa/Desktop/" toPath:@"./1/1" //参数要写全称 error:&error];
6> 删除文件/目录
//删除文件/目录//谨慎使用(会直接删除 不会丢到废纸篓中)ret = [fm removeItemAtPath:@"./1.txt" error:&error];
7> NSData与字符串
NSString * str = @"hello world";//将OC字符串转换成NSData类型//NSData 文件缓冲区NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding]; //将NSData类型转换成NSString类型NSString * str2 = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
8> 文件读写操作
//文件读写操作//第一步打开文件//FILE * fp = fopen("./1.txt","w");文件指针//文件句柄//以只读方式打开NSFileHandle * fh = [NSFileHandle fileHandleForReadingAtPath:@"/Users/aaaaa/Desktop/string.c"]; //以只写方式打开fh = [NSFileHandle fileHandleForWritingAtPath:@"/Users/aaaaa/Desktop/string.c"];//以读写方式打开fh = [NSFileHandle fileHandleForUpdatingAtPath:@"/Users/aaaaa/Desktop/string.c"]; //OC的打开函数都会把偏移量定位在未见首//若想在文件尾进行操作,可将文件偏移量定位到文件尾[fh seekToEndOfFile];//定位到文件尾NSData * data1 = [fh readDataOfLength:10];//读取指定个数字节NSData * data2 = [fh readDataToEndOfFile];//从当前偏移量读到文件尾[fh seekToFileOffset:10];//把文件偏移量定位到10字节
9> 向文件中写数据
NSFileHandle * fh2 = [NSFileHandle fileHandleForUpdatingAtPath:@"./1.txt"];NSString * str = @"hello world";NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];//写数据必须要转化为NSData[fh2 writeData:data];
10> 获取文件长度
//通过文件管理器获取文件属性然后通过字典获取文件长度NSFileManager * fm = [NSFileManager defaultManager];NSDictionary * dict = [fm attributesOfItemAtPath:@"/Users/aaaaa/Desktop/string.c" error:&error];//方法一:NSLog(@"size = %lld",[dict fileSize]);//方法二:NSLog(@"%@",[dict objectForKey:NSFileSize]);
- 黑马程序员---Objective-C 学习笔记之三
- 【黑马程序员】Objective-C语言学习笔记之小知识点
- 黑马程序员---Objective-C学习笔记之二
- 黑马程序员---Objective-C Foundation框架学习笔记之二
- 黑马程序员----Objective-C学习笔记之动态类型检测
- 黑马程序员----Objective-C学习笔记之构造方法
- 黑马程序员----Objective-C学习笔记之@property参数
- 黑马程序员----Objective-C学习笔记之autorelease基本使用
- 黑马程序员---Objective-C学习笔记之一
- 【黑马程序员】Objective-C语言学习笔记之对象的创建、使用和方法调用(三)
- 黑马程序员---C语言学习笔记之三
- 黑马程序员——Objective-C学习笔记(三):组合
- 黑马程序员----Objective-C学习笔记之OC基础练习笔记
- IOS之Objective-C学习笔记(三)
- IOS之Objective-C学习笔记(三)
- 【黑马程序员】Objective-C语言学习笔记之HelloWorld(一)
- 【黑马程序员】Objective-C语言学习笔记之核心语法(四)
- 黑马程序员----Objective-C学习笔记之点语法的介绍和使用
- github导入工程报错问题
- 关于android(安卓)模拟器加速
- unity3d项目导入到eclipse
- SSL证书安装错误
- php之Memcache
- 黑马程序员---Objective-C 学习笔记之三
- 淡淡的忧伤
- U盘安装ubuntu kylin
- 清除被占用的串口号列表批处理
- 甜食爱好者
- c++ 书籍(zz)
- 最小费用最大流(邻接矩阵和邻接表)
- python pip环境搭建
- D - Strongly Connected City