黑马程序员---Objective-C 学习笔记之三

来源:互联网 发布:web前端页面性能优化 编辑:程序博客网 时间:2024/05/06 12:32
------- android培训、java培训、期待与您交流! ----------

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]);


0 0
原创粉丝点击