OC加强DAY04 - 协议与代理

协议

协议的基本使用

协议: protocol

1. 协议: 专门用来写方法的声明的,协议中不能写属性.

遵守了协议的类,这个类就拥有了这份协议中的所有的方法的声明,而不用自己去定义.

2. 声明一个协议

@protocol 协议名称 <NSObject>
//这里写方法的声明;
@end
  1. 协议中不能写属性.
  2. 可以写方法的声明
    也可以写(开发中不会写)@property,但是协议中的@property只会生成get set的声明,没有实现.

3. 类遵守协议.

  1. 如果一个类想要拥有某个协议中的所有的方法的声明,就只要遵守这个协议就可以了.

    //遵守协议的格式
    @interface 类名 : 父类名 <协议名称>
    // : 冒号 是继承  <>尖括号是遵守协议
    @end
  2. 类遵守协议的效果:就是拥有协议的声明 ,不会自动实现.如果没有实现协议中的方法,编译的时候会给一个警告,执行的时候如果调用了没实现的方法,就会报错.如果父类遵守协议,相当于子类也继承了.

4. 继承是单继承.协议是可以多遵守的

@interface 类名 : 父类名 <协议名1,协议名2,......>
@end
//如果一个类遵守了多分协议,这个类就拥有了所有协议中的方法和声明

5. @required@optional

  1. 遵守协议可以获得方法,但是还是要自己去实现
  2. 这两个关键字是用来修饰协议中的方法的
  3. @required修饰的方法,如果遵守这个协议的类不去实现的话,编译器就会报警告
  4. @optional修饰的方法,如果遵守这个协议的类不去实现的话,编译器不会报警告
  5. 无论是哪一个,如果不实现,编译的时候都不会飘红(报错)
  6. 唯一的作用:在于程序员之间的沟通.
  7. 我写一份你来遵守,@required是必须遵守实现的,@optional可以不实现.
  8. 默认值是@required.

协议的基本使用

1. 协议可以继承并且可以多继承

协议如何继承另外一个协议?
@protocol HMSportPotocol<NSObject>

@protocol HMStudyProtocol<HMStudyPorocol,HMPlayPotocol>

@interface HMPerson : NSObject <HMStudyPotocol>//继承study协议同时自动继承了它的父协议Sport,Play协议.

2. NSObject是个类,是所有OC类的父类

Foundation框架中有个协议也叫NSObject.协议名字和类名一样不冲突
NSObject类遵守了NSObject协议.
所以NSObject类里面拥有了NSObject协议中的所有声明.
所以所有的OC类都拥有了NSObject协议中的方法声明
协议的规范:要求##所有的协议##直接或者间接的##从NSObject基协议继承##.

3. 协议 延展 分类的比较

分类: 将一个类分为多个模块,为一个类添加方法
延展: 专门用来私有化类的成员的
协议: 定义一份协议,可以让其他的类来遵守这个协议,遵守后获得协议中所有方法声明
继承: 子类继承父类,子类就拥有了父类的所有的成员

协议的类型限制

1. 声明一个遵守协议的指针

  • 请声明1个指针,这个指针可以指向任意的OC对象.
    • 但是要求这个对象必须要遵守指定的协议.
    • 如果指针指向的对象不遵守这个协议,起码要给我1个大大的警告.
//NSObject指针或者id指针都可以.回一下有啥区别?
id<协议名> 指针名;
id<HMSportProtocol> id1;
//这样,id1指针要求指向的对象必须遵守HMSportProtocol协议,否则就给黄色警告.
  • 声明1个指针,这个指针可以指向任意的OC对象.
    • 要求这个指针指向的对象,遵守多个协议
      • id<HMSportProtocol,HMStudyProtocol> id1;
    • 要求指向一个人对象,并且这个人对象要遵守指定的协议.
      • HMPerson<HMSportProtocol *p1;

2. 为什么要做类型限制

  1. 只有遵守了协议的类,才100%拥有这个协议中的方法
  2. 我们后面要调用这个对象中的协议方法
  3. 为了保证这个对象中一定有这个协议方法,所以我们要求指针指向的对象要遵守指定的协议

代理

应用场景-找女朋友

  1. 用面向对象模拟李凯找女朋友的过程
    • 李凯找女朋友的需求
    • 会洗衣服
    • 会做饭
    • 有国企工作优先考虑..
  2. 找类:
人类:

女朋友类:
    美国女孩.
    印度女孩.
    火星女孩.
    狗...
    只要会洗衣服,会做饭,就可以
@protocol HMGFProtocol <NSObject>
- (void)xiYiFu;
- (void)cook;
@optional
- (void)haveAGoodJob;
- @end


@interface HMPerson : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)int money;
//重点是下面的,人类拥有一个女朋友对象,谁都行,只要遵守GF协议这个也就是代理对象.帮助当前对象来完成某件事情
//下面的实际实在
@property(nonatomic,strong)id<HMGFprotocol> girlFriend;//@implementation中的.
- (void)talkLove;
{
    NSLog(@"哈尼,我回来了~");
    [_girlFriend xiYiFu];
    [_girlFriend cook];
    NSLog(@"亲爱的你真好,明天继续哦~");
}
@end

int main()
{
    HMPerson *p1 = [HMPerson new];
    p1.name = @"李凯";
    p1.money = INT32_MAX;
    HMGirl *fj = [HMGirl new];
    p1.girlFriend = fj;//如果没有遵守协议这句话就黄了,报警高
    [p1 talkLove];//如果没有实现方法,就会谈崩了.
    return 0;
}

代理设计模式

1. 设计一个类HMTableView

提供一个方法打印表格.

2. 为方法传递数据的方式

  • 为方法传递数据的方式,可以用代理传数据
    • 参数:
      • 参数只适合比较少的数据,10个以内
      • 如果太多的话,就感觉在也不会爱了
    • block
      • 主要传递代码
    • 代理,==适合传输多个数据==
      • 当数据较多的时候
      • 调用代理中的方法获得返回值
      • 在类中实现方法,控制返回值.

Foundation框架

苹果或者牛X的第三方事先将程序员在编程的时候经常要用到的一些功能写好.把这些功能封装在一个一个的类中,这些类的集合就叫做框架.

不同的框架中的类是用来做不同的事情的

-不同的框架中的类是用来做不同的事情的
- Foundation: 包.有很多类 函数 数据类型.
- 基础,基本,这个框架中定义的是我们最基础的类
- 其他的框架都是基于Foundation框架的
- AVFoundation : 音频视频相关的
- UIKit: 做界面的
- CoreLocation : 定位有关的

  • 这几天为大家介绍Foundation框架中最常用的类.
    • 特点:
      • 简单到爆~只学怎么用.不要研究底层
      • 量大,各种记.
      • 介绍最常用的.

后面要学的类

NSString
NSURL
NSMutableString
NSArray
NSMutableArray
NSNumber
NSDictionary
NSMutableDictionary
NSFileManager
NSData
NSDate
CGPoint
CGSize
CGRect
NSValue
copy
单例

NSString类.

NSString是一个类,定义在Foundation框架中的.

NSString对象的作用:用来存储字符串数据的.

标准的创建方式NSString *str1 = [[NSString alloc] init];.
这样的方式创建的字符串对象中存储的数据是@"",空字符串.

NSString是OC当中最常用的对象.

所以为了快速的创建NSString对象
OC提供了一种更为快捷的方式创建NSString对象.
使用@符号
@”jack” 是创建NSString对象的简写方式
本质上是一个NSString对象,对象存储的是”jcak”这个字符串
str中存储的是对象的地址. NSString *str = @"jack";.
实际上是创建了一个字符串对象,将jack存储进去.

%@本质.

%p 是打印地址
%@ 是打印指针指向的对象.调用对象description方法.

NSString的恒定性.

我们创建字符串对象的时候,如果使用@来创建

那么这个字符串对象是存储在常量区中的.
如果调用类方法来创建字符串对象,这个对象是存储在堆空间中的
NSString *str1 = @”jack”; //这个字符串对象存储在常量区的(数据段)
NSString *str2 = [NSString new]; //这个字符串对象是存储在堆区的.
NSLog(@”str1 = %p”,str1);
NSLog(@”str2 = %p”,str2);
你会发现,这两个对象的地址相差很多 说明他们不在1个区中.

什么叫恒定性

存储在内存中的字符串对象,无论是在堆区还是常量区
这个字符串对象的内容是无法更改的.

字符串一旦创建,这个字符串对象中存储的字符串数据就不能改变
永远都只能存储这个

为NSString指针重新赋值一个字符串的时候,并不是修改原来的哪个字符串
而是重新的创建了一个字符串对象,将这个新的字符串对象的地址赋值给指针

==不可更改性,即针对堆区,也针对常量区字符串对象==

当系统要在内存中创建一个字符串对象的时候.

比如:当准备要在常量区创建字符串对象的时候,会先检查常量区中是否有内容相同的字符串对象,如果有,直接指向,没有才会创建.

堆区:
1. 如果字符串创建在堆区,不回去检查常量区.
2. 只会检查堆区中是否有相同内容的字符串对象,如果有直接指向,如果没有才会重新创建

常量区中的数据是不会被回收肚的.

存储爱常量区中的字符串不会被回收.
NSString *str1 = @"jcak"; str1 = nil;.

为什么不回收.因为对象的引用计数器不为0;
为什么字符串不允许回收呢?
为了提高效率.不止苹果,所有的语言都认为字符串你用了一次肯定还会用第二次
提高效率, 当第二次使用的时候,效率就高了.因为不用创建字符串对象了.

NSString 最常用的5个方法.

  1. 得到字符串的长度@property (readonly) NSUInteger length;
  2. 得到指定下标的字符- (unichar)characterAtIndex:(NSUInteger)index;返回值是unichar,打印用大C %C .
  3. ==以拼接变量的方式组成一个新的字符串==+ (instancetype)stringWithFormat:(NSString *)format, ... , ... 代表随便给多少个参数
  4. ==判断两个字符串是否相等== - (BOOL)isEqualToString:(NSString *)aString;;

== 判断的是左右两边的值是否相等.

NSString *str1 = @"jack";
NSString *str2 = [NSString stringWithFormat:@"jack"];

这个str1 和 str2的值就不一样了,在不同的区
所以判断两个字符串的内容是否相等千万不要用 ==
而是用对象方法.

  1. 将C语言的字符串转换为OC字符串对象.+ (nullable instancetype)stringWithUTF8String:(const char *)nullTerminatedCString;

nullable 代表返回的对象可能是nil.当转换失败的时候.

  1. 将OC字符串转换为C字符串. [str UTF8String]; 不太常用
    @property (nullable, readonly) __strong const char *UTF8String

NSString 常用方法.

  1. 将字符串写入到指定的文件当中- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;
path : 路径
encoding: 字符编码 建议NSUTF8StringEncoding
NSString *str = @"我爱你!";
NSError *err = nil;
BOOL res = [str writeToFile:@"/Users/admin/Desktop/abc.txt" atomically: NO encoding:NSUTF8StringEncoding error:&err];
// YES 创建临时文件,成功在拷贝到指定目录.NO 效率高,不安全. 要效率,建议NO
//二级指针,error:如果发生错误err就会指向一个错误对象,可以得到错误的信息.
  1. 从指定的文件中读取字符串数据+ (nullable instancetype)stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error;

str的值如果是nil 说明失败.
err的值如果不是nil 说明失败

  1. 字符串还可以从网络上读写数据

可以读取一个网页的源代码.ftp服务器上的文件也可以读取.
URL:同意资源路径,也就是一个网址ftp文件的地址.磁盘上的文件的地址.

网址的URL标准写法: http://www.itheima.com
ftp文件的URL标准写法: ftp://server.itheima.com/aa.avi
磁盘文件路径: file:///Users/Itcast/Desktop/abc.txt

NSString可以从一个URL路径中读写数据.

  • 先将URL路径封装在1个NSURL对象中
    • NSURL *url1 = [NSURL URLWithString:@"http://www.itheima.com"];
    • NSURL *url2 = [NSURL URLWithString:@"ftp://server.itheima.com/1.txt"];
    • NSURL *url3 = [NSURL URLWithString:@"file:///Users/Itcast/Desktop/abc.txt"];
  • 使用类方法从NSURL对象中读取数据.
    • + (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
  • 往NSURL中写入数据

    • - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error;

      1. 字符串比较方法
        - (NSComparisonResult)compare:(NSString *)string; 返回值是枚举-1 0 1
  • 指定选项的比较

    • 忽略大小写的比较
      • int len = [str1 compare:str2 options:NSCaseInsensitiveSearch];;
      • 如果忽略大小写一样的话返回0;
    • 完全匹配的比较
      • int len = [str1 compare:str2 options: NSLiteralSearch];
      • 等于没给参数.
    • 比较字符串中的数字的大小
      • int len = [str1 compare:str2 options: NSNumericSearch];
      • 比较的是字符串中的数字的大小.
      • 前提是:两个字符串的格式要相同,一般情况下用来比较两个路径.
  • 判断字符串是否以指定的字符串开始的
    • - (BOOL)hasPrefix:(NSString *)str;
  • 判断字符串是否以指定的字符串结束的.
    • - (BOOL)hasSuffix:(NSString *)str;
  • 在字符串中搜索子字符串的范围
    @"i love rose";

    @"love";

    范围: 起始下标是:2 长度: 4


    - (NSRange)rangeOfString:(NSString *)searchString

    返回值代表子字符串在主串中的范围.
    返回值是个NSRange 这是1个结构体.

     typedef struct _NSRange {
        NSUInteger location;
        NSUInteger length;
     } NSRange;

     location:  代表这段范围的起始下标.
     length: 代表匹配的长度.


     如果在主串中没有找到子串. 返回的NSRange结构体变两的length的值就是0.location的值就是NSUInteger的最大值.
     所以,如果我们要判断是否在主串中找了子串.
     1). 判断返回的NSRange结构体的length是否为0
     2). 也可以判断location的值是否为最大值.NSNotFound就代表它的最大值.

     如果找到的情况下:
     location的值 是第一次匹配到的下标.
     length的值就是子串的长度.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 …………………………………………………………………………………………………………..7 1 领域 8 2 参考文鲜 8 3 定义,符号与缩写词 9 3.1 定义 9 3.2 符号 9 3.3 缩写词 9 4 综述 10 4.1 进程规范准则 10 4.2 向下兼容性 10 4.3 规约 10 5 X2AP 业务 10 5.1 X2AP 进程模块 11 5.2 并行处理 11 6 信令传输业务 11 7 X2AP的功能 11 8 X2AP 进程 12 8.1 基本过程 12 8.2 基本移动性过程 12 8.2.1 切换准备 12 8.2.1.1 综述 12 8.2.1.2 成功操作 13 8.2.1.3 未成功操作 14 8.2.1.4 异常情况 14 8.2.2 SN 状态传输 15 8.2.2.1 综述 15 8.2.2.2 成功操作 15 8.2.2.3 异常情况 15 8.2.3 UE 文本释放 15 8.2.3.1 综述 15 8.2.3.2 成功操作 16 8.2.3.3 未成功操作 16 8.2.3.4 异常情况 16 8.2.4 切换取消 16 8.2.4.1 综述 16 8.2.4.2 成功操作 16 8.2.4.3 未成功操作 17 8.2.4.4 异常情况 17 8.3 全局进程 17 8.3.1 负载标识 17 8.3.1.1 综述 17 8.3.1.2 成功操作 17 8.3.1.3 未成功操作 17 8.3.1.4 异常情况 18 8.3.2 错误指示 18 8.3.2.1 综述 18 8.3.2.2 成功操作 18 8.3.2.3 未成功操作 18 8.3.2.4 异常情况 18 8.3.3 X2 配置 18 8.3.3.1 综述 18 8.3.3.2 成功操作 18 8.3.3.3 未成功操作 19 8.3.3.4 异常情况 19 8.3.4 重置 19 8.3.4.1 综述 19 8.3.4.2 成功操作 20 8.3.4.3 未成功操作 20 8.3.4.4 异常情况 20 8.3.5 eNB 配置更新 20 8.3.5.1 综述 20 8.3.5.2 成功操作 20 8.3.5.3 未成功操作 21 8.3.5.4 异常情况 22 8.3.6 资源状态上报初始化 22 8.3.6.1 综述 22 8.3.6.2 成功操作 22 8.3.6.3 未成功操作 23 8.3.6.4 异常情况 23 8.3.7 资源状态上报 23 8.3.7.1 综述 23 8.3.7.2 成功操作 24 9 X2AP通信粒子 24 9.0 综述 24 9.1 消息功能定义与内容 24 9.1.1 基本移动性进程的消息 24 9.1.1.1 切换请求 24 9.1.1.2 切换请求确认 26 9.1.1.3 切换准备失败 26 9.1.1.4 SN 状态传输 27 9.1.1.5 UE 文本释放 27 9.1.1.6 切换取消 28 9.1.2 全局进程消息 28 9.1.2.1 负载信息 28 9.1.2.2 错误指示 29 9.1.2.3 X2 配置请求 29 9.1.2.4 X2 配置响应 30 9.1.2.5 X2 配置失败 30 9.1.2.6 重置请求 31 9.1.2.7 重置相应 31 9.1.2.8 启动配置更新 31 9.1.2.9 启动配置更新确认 33 9.1.2.10 启动配置更新失败 33 9.1.2.11 资源状态请求 33 9.1.2.12 资源状态响应 34 9.1.2.13 资源状态失败 35 9.1.2.14 资源状态更新 35 9.2 信息粒子定义 35 9.2.0 综述 35 9.2.1 GTP 管道端点 36 9.2.2 路径激活 36 9.2.3 切换限制列表 38 9.2.4 PLMN 指示符 38 9.2.5 DL 转发 39 9.2.6 原因 39 9.2.7 临界诊断 43 9.2.8 服务小区信息 44 9.2.9 E-RAB 标准 QoS 参数 46 9.2.10 GBR QoS 信息 46 9.2.11 比特速率 47 9.2.12 UE 总计最大比特速率 47 9.2.13 消息类型 47 9.2.14 ECGI 48 9.2.15 COUNT 值 48 9.2.16 GUMMEI 48 9.2.17 UL 干扰过载指示 49 9.2.18 UL 高干扰指示 49 9.2.19 相对窄带TX 功率(RNTP) 49 9.2.20 GU 分组ID 50 9.2.21 位置上报信息 50 9.2.22 全局eNB ID 51 9.2.23 E-RAB ID 51 9.2.24 eNB UE X2AP ID 51 9.2.25 用于RAT/频率优先级的用户简介ID 51 9.2.26 EARFCN 51 9.2.27 传输带宽 52 9.2.28 E-RAB 列表 52 9.2.29 UE 安全性性能 52 9.2.30 AS 安全信息 53 9.2.31 配置与保存优先级 53 9.2.32 等待时长 54 9.2.33 SRVCC 操作可能 54 9.2.34 硬件负载指示符 55 9.2.35 S1 TNL 负载指示器 55 9.2.36 负载指示器 55 9.2.37 无线资源状态 55 9.2.38 UE 历史信息 55 9.2.39 最后访问的小区信息 56 9.2.40 最后访问的E-UTRAN 小区信息 56 9.2.41 最后访问的GERAN 小区信息 56 9.2.42 小区类型 56 9.3 消息与信息粒子的抽象语法(按照ASN.1) 58 9.3.1 综述 58 9.3.2 用于非标准场合的私人信息的用法 58 9.3.3 基本进程定义 58 9.3.4 PDU 定义 63 9.3.5 信息粒子定义 76 9.3.6 通用定义 93 9.3.7 固定定义 94 9.3.8 容器定义 96 9.4 消息传输语义 101 9.5 计时器 101 10 为未知,意外以及错误协议数据的处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值