OC加强(三)之protocol(协议)/代理
1.protocol概念以及基本使用
1、protocol的使用注意
OC中的协议(protocol)使用注意:
1)Protocol:就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写实现。
2)只要某个类遵守了这个协议,就拥有了这个协议中的所有方法声明 。
3)只要父类遵守了某个协议,那么子类也遵守。
4)Protocol声明的方法可以让任何类去实现,protocol就是协议。
5)OC不能继承多个类(单继承)但是能够遵守多个协议 继承(:),遵守协议(< >)
6)基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
7)协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明
2、id和instancetype的区别
id和instancetype的区别
1)instancetype只能作为函数或者方法的返回值
2)id能作为方法或者函数的返回值、参数类型,也能用来定义变量
3)instancetype对比id的好处
* 能精确地限制返回值的具体类型
3.protocol代理设计模式
代理是一个很神奇的东西,什么意思呢?就是代替别人做事儿,俗称佣人,跟协议密切相关
假设学生想租房子住,但自己又不能直接和租户有联系,因为没有租户信息,那么就只能找中介来帮忙找房子了
中介就是一个代理对象,就是中介你去给我找房子吧,找来我付钱住就行了
这个时候找房子就是一个协议,
// // findHouse.h // OC9-block和协议 // // Created by IOSBasic_7 on 15/10/22. // Copyright © 2015年 itheima. All rights reserved. // #import <Foundation/Foundation.h> @protocol findHouse <NSObject> -(void)findHouse; @end
// // Student.h // OC9-block和协议 // // Created by IOSBasic_7 on 15/10/22. // Copyright © 2015年 itheima. All rights reserved. // #import <Foundation/Foundation.h> #import "findHouse.h" @interface Student : NSObject -(void)goHome; //委托中介帮忙找房子 //给delegate赋值的对象,必须要遵守 findHouse 协议 @property id<findHouse> delegate; @end
// // Student.m // OC9-block和协议 // // Created by IOSBasic_7 on 15/10/22. // Copyright © 2015年 itheima. All rights reserved. // #import "Student.h" @implementation Student -(void)goHome{ //中介帮他找房子 // WAWJ [self.delegate findHouse]; } @end
// // LinkHome.h // OC9-block和协议 // // Created by IOSBasic_7 on 15/10/22. // Copyright © 2015年 itheima. All rights reserved. // #import <Foundation/Foundation.h> #import "findHouse.h" @interface LinkHome : NSObject<findHouse> @end
// // LinkHome.m // OC9-block和协议 // // Created by IOSBasic_7 on 15/10/22. // Copyright © 2015年 itheima. All rights reserved. // #import "LinkHome.h" @implementation LinkHome -(void)findHouse{ NSLog(@"链家正在帮着找房子"); } @end
/* 代理模式设计思路: 1,先定义一个协议 2,定义一个代理的类,遵守这个协议 3,在需要代理的类中,定义实例变量 id<协议> delegate; 4,在需要代理的类中,需要有行为,去启动代理 5,在使用代理的时候,给需要代理的类的delegate对象赋值 人要买电影票 Person App -> 百度糯米 美团 大众点评 */ #import <Foundation/Foundation.h> #import "Student.h" #import "LinkHome.h" #import "WAWJ.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu = [Student new]; LinkHome *lh = [LinkHome new]; WAWJ *wj = [WAWJ new]; //给学生一个代理对象 stu.delegate = wj; [stu goHome]; } return 0; }
2.NSString介绍及基本使用
什么是NSString?
NSString其实就是一个类名而已,是用来定义字符串变量的,所以又称为字符串类
定义字符串的方式:
1)第一种方式:最直接的方式
NSString *str = @"abc";
此时:str存储在栈区,abc存储在常量区
2)第二种方式:格式化的方式
//2,格式化的创建 // Xcode6 iOS8 的时候 NSString *str1 = [NSString stringWithFormat:@"我一贱你就笑!,%d",520];
此时:str1存储在栈区,字符串"我一贱你就笑"存储在堆区
3)第三种方式:从文件中读取
如何把字符串保存到文件中? // [str1 writeToFile:文件路径及名称 atomically:YES/NO 是否要线程安全 encoding:字符串的编码格式 error:存储错误信息的对象] //NSError 用于处理错误的类 NSError *err; //写入字符串到文件中 //NSUTF8StringEncoding utf-8的编码格式 BOOL isYes = [str1 writeToFile:@"/Users/jeff_mao/Desktop/str.txt" atomically:NO encoding:NSUTF8StringEncoding error:&err]; if (isYes) { NSLog(@"写入成功"); }
4,如何从文件中再把字符串读取出来 // [NSString stringWithContentsOfFile:路径 encoding:编码格式 error:错误信息] NSString *readStr = [NSString stringWithContentsOfFile:@"/Users/jeff_mao/Desktop/str.txt" encoding:NSUTF8StringEncoding error:nil]; NSLog(@"readStr = %@",readStr);
3.使用NSURL读写字符串
1)
什么是URL?
URL的全称是Uniform Resource Locator(统一资源定位符) URL是互联网上标准资源的地址 互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置 根据一个URL就能找到唯一的一个资源
// urlWithString:@"sms://110"
传入完整的字符串创建
NSURL *url = [NSURL URLWithString:@"file:///Users/apple/Desktop/str.txt"]; 通过文件路径创建(默认就是file协议的)
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/str.txt"];

浙公网安备 33010602011771号