A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏武 高级黑马   /  2015-8-26 21:50  /  852 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/******************************使用协议的流程:*********************************/
使用协议的流程:

一、定义协议
什么是协议?   协议就是一些方法的声明,一般写到一个.h的头文件中.

协议的定义:(默认情况下遵守 NSObject协议)
    @protocol 协议名称 <NSObject>
    @end

声明的方法有两种:
    1,必须实现的方法;
    2,选择实现的方法;


二,遵守协议
(让某个类遵守协议,一个类可以遵守多个协议,在<>中用逗号隔开)
    1) 遵守一个协议:(先导入协议的头文件)
    @interface 类名 :NSObject <要遵守的协议名称>

    @end

    2) 遵守多个协议
    @interface 类名 :NSObject <要遵守的协议名称,要遵守的协议名称,要遵守的协议名称>

    @end

三,实现协议中的方法
(在类的.m文件中实现协议中的方法)
    1),定义一个协议:
    @protocol baseProtocol <NSObject>
    //声明一些方法
    -(void)eat;
    -(void)run;
    @end

    2),让类遵守这个协议
    // 1) 导入 头文件
    #import "baseProtocol.h"
    @interface Person : NSObject<baseProtocol>
    @end

    3),在类的.m文件中实现协议的方法
    @implementation Person
    -(void)eat{
        NSLog(@"长得漂亮又能吃,吃货,长得丑,又能吃,叫饭桶");
    }
    -(void)run{

        NSLog(@"人会跑");

    }
@end

    结论: 当一个类遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明

/***************************************************************/

1,一个协议也可以遵守其他的协议;
    @protocol workProtocol <NSObject>
    @end

    #import "workProtocol.h"
    @protocol baseProtocol <NSObject,workProtocol>
    @end

protocol的其他用法:
    1),不能声明成员变量;
    2),只要父类遵守了某个协议,那么子类也遵守;
    3),OC中的类可以遵守多个协议;
    4),基协议是NSObject;
    5),协议可以遵守多个协议;


2,@required 和 @optional 都是协议中的关键字
    @required 修饰的方法是必须要实现的,如果不实现,编译器会发出警告,默认
    @optional 修饰的方法是可以实现,也可以不实现的

3,protocol类型限制
    第一种类型限制:
    给id类型增加限制
        id<houseHold> obj;
    增加<houseHold>以后,表示,obj只能赋值遵守了houseHold协议的对象

    第二种类型限制:
    表示,obj2赋值的时候,必须是Girl对象,并其遵守了houseHold协议.
        Girl<houseHold> *obj2;

    格式:
        对象<协议名称> 对象指针;   (通过协议,对这个对象做一些限制)

4,id和instancetype的区别
    1).都能作为函数的参数返回值
    2).id能作为方法或者函数的返回值、参数类型,也能用来定义变量
    3).instancetype 能精确限制返回值类型

5,代理模式,  (传入的对象,代替当前类完成了某个功能,称为代理模式)
思路:
    1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现
    findHouse方法
        @protocol findHouseProtocol <NSObject>
        -(void)findHouse;
        @end

    2)创建一个代理类(比如LinkHome),遵守上面的代理协议
        @interface LinkHome : NSObject<findHouseProtocol>
        @end

    3)在需要代理的类中(Student),定义一个对象类型为id且遵守代理协议的成员变量
    @property(nonatomic, strong)id <findHouseProtocol>delegate;

    4)在Student类中调用成员变量_delegate(代理)的方法,调用代理类的方法
    [self.delegate findHouse];

    5)main.m或其他使用Student类的文件中,为Student类的成员变量(代理类)赋值
         LinkHome *linkHome = [LinkHome new];
         stu.delegate = linkHome;

    通过中介找房子的代码自己敲一遍;

6,@protocol关键字,告诉编译器,这是一个协议.
在.m文件中使用的时候,需要导入这个协议.
    @protocol delegate; 声明一个协议.
    @class Person; 声明一个类。

7,Foundation框架
  框架是由许多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使研发程序变得更容易.
  Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,字典和集合,其他功能包括处理日期和时间、内存管理、处理文件系统、存储(或归档)对象、处理几何数据结构(如点和长方形)

显示隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool true
隐藏隐藏文件 : defaults write com.apple.finder AppleShowAllFiles –bool false



8,NSString的用法
    1).直接创建方式:
    NSString *str = @"abc";

    2).格式化创建:
    NSString *st2 = [NSString stringWithFormat:@"%@", @"jack"];
    NSString *str = [[NSString alloc] initWithFormat:@"My age is %d", 10];

    3).文本编码:
    中文 :GBK(2个字节)     GB2312(2个字节)
    UTF - 8:国际通用编码(3个字节)

    4). 字符串写入文件:
    //错误对象
    NSError *err;
    [str writeToFile:@"/Users/zhaoxiaohu/Desktop/" atomically:YES  encoding:NSUTF8StringEncoding error:&err];

    5).字符串从文件读取:
    NSString *str = [NSString stringWithContentsOfFile:@"/Users/zhaoxiaohu/Desktop/str.txt" encoding:NSUTF8StringEncoding error:&err];

    6).字符串比较函数:
    NSComparisonResult result = [str1 compare:str2];

    //比较的时候,不区分大小写,参考字符的个数进行比较
    NSComparisonResult result = [str1 compare:str2 options:NSCaseInsensitiveSearch|NSNumericSearch];

    返回值:
    NSOrderedAscending(str1<str2)升序
    NSOrderedDescending(str1>str2)降序
    NSOrderedSame(str1 = str2)相等


    7). 判读字符串是否相等:
    NSString *str1 = @"abc";
    NSString *str2 = @"abc";
    str1 == str2       比较的是地址  (==比较的是字符串的地址)
    [str1 isEqualToString:str3],比较的是内容,区分大小写(这个方法非常常用)


    8). 检测字符串前后缀:
    NSString *url = @"http://asdfasdfasdfaasdfadsfaf";
    [url hasPrefix:@"http://"]; 字符串是否以http:开头

    NSString *imgName = @"logo.jpg";
    [imgName hasSuffix:@".jpg"]; 检测字符串是否以.jpg结尾


    9).查找字符串:
    NSString *str = @"asitcastdfafsadfxyz asdfasdfsadfa sadf";
    NSRange range = [str rangeOfString:@"itcast"];

    //NSNotFound 是一个最大的long 无符号数
    //如果查找不到 range.location 是一个最大的long 无符号数
    //range.location 表示字符串首次出现的位置
    //range.length   表示子字符串的长度
    if (range.location != NSNotFound) {
        NSLog(@"位置:%lu,长度:%lu",range.location,range.length);
    }else{

        NSLog(@"没有查找到");
    }

    格式:
        NSRange range = [str1 rangeofString:str2]; //str1 中找str2



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马