OC基础知识 iOS
第一讲:类、对象
1、OC简史
1)NextStep公司的由来,cocoa的由来
NeXT是由苹果公司的创办人乔布斯于1985年被苹果公司辞退后同年成立。然后在1996年已4亿美元收购下了NeXT。
3)面向对象语言 :
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
面向对象是把构成问题事物分解出各个对象,建立对象的母的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。面向对象是以功能来划分问题,而不是步骤。比如说要把五子棋改成围棋,如果你是面向过程的设计,那么五子棋的规则分布在了你的程序每一个角落,要改动还不如重写。而面向对象的设计你只需要改动规则对象就可以了。五子棋和围棋的区别不就是规则不同吗?
五子棋:面向过程的设计思路就是首先分析问题的步骤:1.开始游戏,2.黑白双方,3、绘制画面,4,判断输赢,5,轮到白子,6,绘制画面,7,判断输赢,7,返回步骤2、9.输出最后结果。把上面每个步骤分别用函数来实现,问题就解决了。
面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1.黑白双方,这两方的行为是一模一样的。2、棋盘系统,负责绘制画面。3、规则系统,负责额判定诸如犯规、输赢、等。第一类对象(玩家对象)负责用户输入,并告知第二对象(棋盘对象)妻子布局的变化,棋盘对象接受到了棋子的变化,棋盘对象接收到了妻子的变化就要负责在屏幕上面显示这种变化,同事利用第三类对象(规则系统)来对棋局进行判定。
2、面向对象三大特性:
1)封装
封装的核心就是:不关心对象的实现方法,不要告诉我你是怎么做,只要做就可以了。我只要结果
2)继承
继承可以使得之类具有父类的各种属性和方法,子类可以重写父类的某些方法,同时也可以在子类追加新的属性和方法
3)多态
多态:同一操作作用于不同的对象,可以有不用的解释,产生不同的执行结果。
有多种表现形式:1.重写 :配合继承使用,进行父类方法的重写
2.方法重载,方法名可以相同,参数个数,或者参数类型、返回值不同
各自的含义及如何体现;
3、OC语言的特点:
1)封闭式语言;底层源代码不开源
2)动态语言;是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函
数可以被删除等结构上的变化
3)C语言扩展集或则子集;C语言的所有关键字及语法可以在OC环境下正常编译运行
4、类、对象
1)创建类、创建对象, 快捷键使用;
创建工程及类—>command +shift+N à new projectà EnteràProject Name à command +N à cocoa class à 1.类名2.继承自的类3.选择编程语言àComplete
2)类、对象的关系;
类和对象的关系就如同模具制作出的物品之间的关系。一个类为它的全部对象给出了一个统一的定义,而他的每个对象则是符合这种定义的一个实体,因此类和对象的关系就是抽象和具体的关系。
3)@public、@protected、@private关键字的使用及作用;
private是当前类中可以使用的,在这个类中的其他地方都不可以使用,public是在所有可以访问到这个类的地方都可以使用。Protected是应用与父类当中的,也就是说父类中写了一个protected的变量,则在其他的子类中也可以访问到这个变量,但是在父类中如果用到了private的话那么除了这个类可以访问到这个变量意外其他地方都访问不到,而public可以说是在任何地方都可以访问到
5、#import、#include、@class、<> 、 “”各自的含义;
1)、#include 会造成重复引用的问题。例如:class A、class B 都引用了class
C ,class D若引用了class A与 class B ,就会报重复引用的错误。
2)、#import功能与include功能相同,不过它避免了重复引用的问题。
3)、@class只是告诉编译器有这个类存在,但是类具体是如何实现的就不用告诉编译器。
4)、“”,用于对用户自定义的文件的引用,编译器首先会去用户目录下查找,然后去安装目录,最后去系统目录查找
5)、<>,用于对系统文件的引用,编译器会在系统目录下查找该文件。
6、@有何作用?
关键字起始符,打印对象
7、初始化对象的过程实现
1.首先要有一个类,例:Person
2.在类中定义成员变量:(NSString *)name;
3.重写init方法:自定义初始化方法:- (instancetype)initWithName:(NSString *)name;
第二讲:方法、继承
1.方法的类型分类:+、-
2、方法调用语法格式:[]、点语法
3、各种方法的定义语法格式
1)无返回值、无参数
2)无返回值、带一个参数
3)无返回值、带多个参数
4)有返回值、无参数
5)有返回值、带一个参数
6)有返回值、带多个参数
4、特殊方法:
1)初始化方法(自定义初始化方法、便利构造器初始化方法,系统自带初始化方法init)
1. -(instancetype)initWithName : (NSString *)name{
self =[super init];
if (self){
_name = [name retain];
}
return self;
}
2. + (Person *) personWithName : (NSString*)name{
Person *person = [ [Person alloc ] initWithName :name];
[person autorelease];
return person;
}
3.
2)setter()、getter()
1. – (void)setName : (NSString*)name{
if (_name != name){
[_name release];
_name = [name retain];
}
}
- (NSString *)name{
return name;
}
[if !supportLists]4)[endif]description()
- (NSString *)description{
return [NSString stringWithFormmat:@”%@”,yanglingshi shabi];
}
5、继承
1)单继承
一个类只能继承一个父类,父类还可以有父类
2)self、super的使用
当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找,;而当使用super时,则从父类的方法列表中开始找,然后调用父类这个方法。
3)继承的优点
继承的优缺点:优点新的实现很容易,因为大部分是继承而来的很容易修改和扩展已有的实现缺点打破了封装,因为基类向子类暴露了实现细节白盒重用,因为基类的内部细节通常对子类是可见的当父类的实现改变时可能要相应的对子类做出改变不能在运行时改变由父类继承来的实现
只有当下列条件满足时才考虑使用继承:子类是一种特殊的类型,而不只是父类的一个角色子类的实例不需要变成另一个类的对象子类扩展,而不是覆盖或者使父类的功能失效
6、多态
1)概念
2)方法重写、方法重载
第三讲:数据类型
[if !supportLists]1、 [endif]OC数据类型:typedef、对象
Typedef类型包括:CGFloat 、NSInteger、NSpoint
可以理解为基本数据类型。对象类型,系统提供的有NSNumber、NSValue、NSString、 NSArray 、NSDictionary、
[if !supportLists]2、 [endif]NSNumber对简单数据类型进行封装和解封装
封装:基本数据类型à对象类型,方法:【类名numberwith…】
解封装:对象类型à基本数据类型,方法:[对象 integerValue];
[if !supportLists]3、 [endif]NSNumberFormatter对NSNumber数据处理格式
步骤:1.首先创建一个NSNumberFormatter格式转换器对象
NSNumberFormatter *formatted= [[NSNumberFormatter alloc]init];
2.s设置格式
[formatter setNumberStyle :枚举类型];
3.创建一个NSNumberFormatter对象。打印即可
4、NSValue对结构体类型进行封装和解封装
封装:结构体有4种:point、rect、size、range。
[NsVlaue valueWith…];
解封装:[value rectValue];
5、NSString不可变字符串
1)初始化 :三种:
1. NSString *str = [NSString alloc]initWithFormat:str1];
2. NSString *str = [NSString stringWithFormat: @”1”];
3. NSString *str = @”21345”;//iOS 5之后的定义方式
2)获取长度、获取某个字符
【str length】;
[str characterAtIndex:3];
3)字符串截取(头、尾、中间范围)
[str substringToIndex:1];//从头开始到某个下标结束
[str substringFormIndex:1];//从某个位置截取到尾部
[str substringWithRange:CGRange];
[if !supportLists]5)[endif]字符串拼接(多种方式)
//1.初始化方式
.[stringWithFormat:@”%@,%@”,字符串1,字符串2];
2.在尾部拼接
[str1 stringByAppendingString:字符串1];
3.随意拼接,可以在@“ ”加入任意内容
[str stringByAppendingFormat:@”%@, %@”,字符串1,字符串2];
4.
把原字符串某个范围用字符串替换
[str stringByReplacingCharactersInRange :CGRange withString :字符串]:
[if !supportLists]6)[endif]字符串查找(含xcode6新添加的方法)(头、尾、各处)
1.头部 (Bool)[hasPrefix:str1];//是否有前缀字符串str1
2.尾部 (BOOL)[has
Suffix:str1];//是否有后缀字符串str1
3、各处:NSrange range = [str rangeOfString:@“待查询字符串”]
If ( 0 == range.length && range.location == NSNotFound ){
NSLog(@”%@”,);
}
[if !supportLists]7)[endif]字符串比较(多种比较方式)
[if !supportLists]1. [endif]compare:str1 返回值 枚举类型 3个值
[if !supportLists]2. [endif]isEqualToString:str1 返回值 bool类型 2个值
[if !supportLists]8)[endif]字符串替换
[str stringByReplacingWithString…:.];
[if !supportLists]9)[endif]字符串与其他基本数据类型的转换(int、float、double、大小写、array等)
[str (int、float、double)Value];
大小写 :1.大写:uppercaseString
2.小写:lowercaseString
3.每个单词首字母大写:capitalizedString
6、NSMutableString可变字符串
1)初始化 三种:一般初始化和便利构造以及第三种我叫不来但很通用
1. NSMutableString *mstr = [[ NSMutableString alloc]initWithFormat:@“%@”,str1];
2.NSMutableString *mstr = [NSMutableString stringWithFormat:@””];
3. NSMutableString *mstr =[ NSMutableString string];
2)插入
insertString:(NSString *) aString atIndex : (NSUinterger)loc;
3)删除
deleteCharactersInRange: (NSRange )range;
4)追加
appendString : (NSString*)aString;
appendString : (NSString *) format
5)替换
repleaseeCharactersInRange : (NSRange) range withString : (NSString*)aString;
7、NSString和NSMutableString的关系
NSMutableString 继承自NSString
8、NSDate
1)初始化
NSDate *date = [ NSDate date];//赋予的是格林威治时间
2)计算时间差
[date1 timeIntervalSinceDate :date2 ];
3)比较两个时间
1.compare
2.isEqualToDate
3.earlierDate
4.laterDate
4)同NSDateFormatter转换时间为某种特定格式
//1.初始化一个时间格式转化器
NSDateFormatter *formatter1 = [ [NSDateFormatter alloc ] init];
//2.设置formatter1的格式
[formatter1 setDateFormat :@”yyyyMMdd”];
.//3.时间转换成字符串
NSString *str =[formatter1 stringFormDate:date1];
//4.字符串转换成date 格式与上边蛇者的格式一致
[formatter1 dateFormString :@”20150828”];
5)快速得到当前时间的中文完整格式
NSDate [ dateWithTimeInter : 3600*8 sinceDate :date1];
6)NSDate和NSString之间的转换:(需要格式转化器作为中间质进行转换)
//1.首先:初始化一个时间格式转换器
NSDateFormatter *formatter =[[NSDateFormatter alloc]init];
//2.设置formater的格式
[formatter setDateFormate: @”yy年MM/ dd HH:mm :ss”]
//3.通过格式转换器进行NSDate 和NSString 的转换
1)、NSDate à NSString
NSString *str =[formatter stringFormDate : date];
2)、NSString à NSDate
NSDate *date = [formatter dateFromString : @” 2015年8月/19 11:59:37”];
9、NSTimer
1)两种初始化的区别(NSRunLoop的使用)
1.一般初始化:-initWithFireDate:interval:target:selector:userinfo:repeats:
2.便利构造
+ scheduledTimerWithTimeInterVal: invocation :repeats;
3.NSRunLoop;
NSRunLoop的本质是一个消息机制的处理模式。用于消息的传递,在Cocoa里边不用自己定义WM_COMMAd_XXX这样的宏来标识某个消息。Apple在设计消息的时候就采用了RunLoop;
( http://blog.csdn.net/davidsph/article/details/7899760 )有详细关于NSTimer的资料
2)结合日期,完成一个计时器和倒计时功能:初始化出错了
第四讲:集合
[if !supportLists]1、 [endif]集合三大类:数组、字典、集(有序集合、无序集合)
数组:NSArray :储存对象类型,同一个数组可以放得对
象类型可以不同
字典:NSDictionary:键、值对应存储数据:
集:NSSet ,与数组、字典功能相同。存放的数据不重复且为乱序;在搜索一个一个元素时:NSSet比NSArray效率高。(hash散列排布);
2、nil标示、NSNull、NULL对象的区别
nil :是一个对象,值为0;数组结尾用nil
NULL :是基本数据类型为空
NSNull:和nil本质是一样的,但在初始化一个数组空间大小
为0时,用NSArray *arr = [ NSNull null];
[if !supportLists]4、 [endif]NSArray不可变数组(对象、有序)
[if !supportLists]1) [endif]初始化
[if !supportLists]1. [endif]NSArray *arr = [[ NSArray alloc] initwithObject:….];//一般初始化
[if !supportLists]2. [endif][ NSArray arrWithArray:aArray]; //用一个数组初始化
[if !supportLists]3. [endif][NSArray arrayWithObjects:数组元素,多个用逗号隔开]。
4. NSArray *arr = @[@”中国”,@(1234),student];
//可以存放的有: 字符串 ,数值对象,自定义对象
[if !supportLists]2) [endif]获取元素个数
[ arr count];
[if !supportLists]3) [endif]获得某个下标下的元素值、获得某个元素所在的下标
[if !supportLists]1. [endif]某个下标的元素:[arrobjectAtIndex : i];
[if !supportLists]2. [endif]第一个元素 :[arr firstObject ];
[if !supportLists]3. [endif]最后一个元素:[ arr lastObject];
[if !supportLists]4. [endif]取某个元素的下标:[arr indexOfObject:数组某个元素];
[if !supportLists]4) [endif]截取
卧槽。。。。
[if !supportLists]5) [endif]遍历(三种遍历方式:普通,快速,枚举)
[if !supportLists]1. [endif]for (int i = 0 ; i < [arr count] ; i++){
NSLog (@”%@”, [ objectOfIndex :i ] );
}
[if !supportLists]2. [endif]增强for
for ( id obj in array ){
NSLog(@”%@”,obj);
}
[if !supportLists]3. [endif]迭代器
NSEnumerator *enumeraror = [ arr objectEnumerator];
Id obj = nil;
While ( obj = [enumerator nextObject]){
NSLog (@”%@”,obj);
}
[if !supportLists]4. [endif]Block 块遍历
[arr enumeratorObjectsUsingBlock:
^(id obj, NSUInteger index , BOOL *stop){
NSLog (@” %@ ” , obj );
//若终断循环
*stop = YES;
}];
[if !supportLists]6) [endif]排序(三种排序方式)
[if !supportLists]1. [endif]sortedArrayUsingSlector
[if !supportLists]2. [endif]sortArrayUsingComparator
[if !supportLists]3. [endif]sortedArrayUsingDescriptors&sortUSingDescriptors
7)简写@[object,…]
4、NSMutableArray可变数组
1)继承于NSArray
2)初始化
3)添加元素
1.addobject:
2.insertObject : (id) anObjectatIndex:
4)删除元素
removeLastObject 移除队尾元素
removeObjectAtIndex: i
5)交换两个下标下的元素
exchangeObjectAtIndex :0 withObjectAtIndex :3
5、NSDictionary(键值对,无序,键唯一)
1)初始化
1.一般初始化:alloc + initWithObjectAndKeys
2.遍历初始化:dictionaryWithObjectAndKeys, nil
3.快速生成 :@{ @”qq”: @”123456”, @”pass”: @”my love”}
2)取值(key=value)
objectForKey
3)遍历
1.allValue allKey
2.for-in
4)简写:@{key : value,…};
6、NSMutableDictionary可变字典
1)初始化
继承自父类NSDictionary , 与父类初始化一样
2)添加
setObject : forKey:
3)移除
removeObjectForKey
7、NSSet、NSMutableSet
1)初始化
1.一般初始化: alloc + initWithObjects : , , nil;
2.遍历初始化:setWithObject:
3.利用数组初始化:setWithArray:
2)与数组的结合使用
数组à 集 :setWithArray
集 à 数组:allObjects;
8、集合类分别在控制台的显示形式,如何取出控制台有效数据
9、综合使用,完成一个通讯录的过程
第五讲:内存管理
1、retainCount 引用计数
2、alloc、retain、copy、new、release、autorelease分别对retainCount的影响
1).alloc、allocwithZone,new,引用计数+1
2).retain手动为该对象+1
3)copy 对应引用计数+1
4)mutableCopy
, 创建一个新对象,新对象引用计数为1
5)release。手动为该对象引用计数-1
6)autorelease :加入自动释放池,当自动释放池释放时,对
象引用计数-1
3. 各个方法中应注意的内存管理:
1)自定义初始化方法;
- (instancetype) initWithName :(NSString *)name age: (NSInteger)age{
self = [super init];
if (self){
_name = [name copy];
_age = age;
}
return self;
}
2)便利构造器初始化方法;
+ (Person *)personInitWithName : (NSString *)name age : (NSInteger) age{
Person *person = [[Person alloc ]initWithName :name age:age];
[person autorelease];
Retrun person;
}
3)对象的setter()中正确的书写形式
- (void) setName : ( NSString *)name{
[ _name release ];
_name = nil;
_name = [ name retain];
}
4. NSAutoreleasePool的作用
在自动释放池内部对象 会在释放池release之后一起释放
5. dealloc的作用
[if !supportLists]1. [endif]MRC模式:释放对象占用的内存空间。
[if !supportLists]2. [endif]ARC模式:释放 系统无法释放的该对象占用的资源,或者其他对象对该对象的引用。
6.集合中的内存管理
[if !supportLists]7. [endif]内存管理原则
[if !supportLists]1. [endif]创建了就要release
[if !supportLists]2. [endif]谁retain 谁release
8、程序在运行时的内存分配
内存分为五大区域(由上到下):栈区、堆区,BSS段、数据区、代码段。(BSS段、数据区、代码段)三块是在程序启动的时候加载的。栈区从高到底分配地址,堆区由低到高分配。程序猿只需要管理的内存只是在堆区的对象。而对象的指针在栈中,指向的内容在堆区。
1.堆区:存放程序运行过程中,动态分配的存储空间
2.栈区:局部变量
3.BSS段:没有初始化的全局变量和静态变量
4.数据区:已经初始化的全局变量和静态变量,以及字符串常量
5.代码段:程序编译后代码的内容
ààà 关系图在云盘;
第六讲:属性
1、属性关键字@property
2、涉及到的参数:nonatomic、atomic、retain、assign、copy、readwrite、readonly、getter(改变名字)、setter、weak、strong,分别有何作用?何时使用?
一、原子性
[if !supportLists]1. [endif]Nonatomic 对属性不加锁,多线程下线程不安全,但速率快
[if !supportLists]2. [endif] atomic,对属性加锁,多线程下线程安全,默认值
二、set方法处理
[if !supportLists]1. [endif]Retain , 先release原来的值,再retain新值
[if !supportLists]2. [endif]assign, 直接赋值,再retain新值
[if !supportLists]3. [endif]copy ,先release原来的值,再copy新值
三、读写属性:
1. readwrite >生成getter、setter方法,默认值
2. readonly >只生成getter方法
四、强弱引用。
1. ARC模式下>strong修饰对象,强引用。相当于retain,
2.MRC模式下>weak ,修饰对象弱引用,相当于assign直接赋值
[if !supportLists]2、 [endif]属性的优点及缺点
属性就是OC提供给程序员快速生成成员变量的访问器(set/get)的语法,提供了点语法更加方便间接使用访问器
4、补讲内容:
1)copy和mutableCopy的区别及使用
copy (拿NSString做例子)
[if !supportLists]1. [endif]对于不可变字符串>>浅拷贝,拷贝后是不可变类型字符串,引用计数2
[if !supportLists]2. [endif]对于可变字符串 >> 深拷贝,拷贝后是可变类型字符串。引用计数1
mutableCopy
[if !supportLists]1. [endif]对于不可变字符串 >>深拷贝,拷贝后的是可变类型字符串,引用计数1
[if !supportLists]2. [endif]对于可变字符串 >>深拷贝,拷贝后的是可变类型字符串,引用计数1
2)深复制和浅复制
深拷贝 >>拷贝的是指针,不会开辟新的内存空间
浅拷贝 >>拷贝的是内容,要开辟被复制相同大小,相同内容的内存空间,
只是地址不一样
补充 :Student *std =[ [Student alloc ]init];
Student *std1 =[[std copy];//需要在Student类重写copy方法
第七讲:单例模式、观察者模式
1、单例模式的定义及使用过程
1)为何使用单例,单例用来处理哪些问题的?用在哪些场合?
1.单例模式和静态方法相似,但他们一个是面向对象,一个是基于对象的。
如果一个方法和他所在类的实例对象无关,那么它就是静态的,反之他就是非静态的就可以使用单例模式了。
2.单例模式用于处理一种只需要初始化一次,并且在程序运行过程中不被释放调的对象。
3.单例模式用在页面间的传值,(UI页面),一个不被再次初始化的变量
2)static在单例中的作用?
不加static,是可能被释放掉得。
3)如何保证单例对象是唯一的
>重写初始化方法
>重写allocWithZone方法
>重写copyWithZone方法
>重写retain 方法
>重写release 方法
>重写retainCount 方法
[if !supportLists]3、 [endif]简单单例和完整单例的写法
+(UserCenter*)standardUserCenter{
if (!instance) {//保证第一次创建成功后不在新建对象
instance =
[[UserCenter alloc]init];
}
return instance;
}
+(instancetype)allocWithZone:(struct _NSZone*)zone
{
if (!instance) {//保证第一次创建成功后不在新建对象
return [super allocWithZone:zone];
}
return nil;
}
//重写copy
- (id)copyWithZone:(NSZone*)zone{
return self;
}
//非ARC模式下更改retain release
-(instancetype)retain{
return self;
}
- (oneway void)release{
}
- (NSUInteger)retainCount{
return NSNotFound;
}
3、KVC、KVO的描述
1)KVC的作用及使用;
KVC观察者模式,Key Value Code通过setVale forKey :赋值
2)KVO三大步骤及监听过程
步骤:1.为对象添加观察路径,判断需要观察哪一个属性
[_dog addObserver:self forKeyPath:@"dogName" options:NSKeyValueObservingOptionNew context:nil]
2.重写观察响应
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change context:(void*)context
{
NSLog(@"媳妇回老家了");
NSLog(@"%@",change);
}
3. 测试
Dog *bmw = [[Dog alloc]init];
bmw.dogName =@"byd";
Student *ren = [[Student alloc]init];
ren.dog = bmw;
[renaddOB]; //给狗添加观察
[bmwsetValue:@"比亚迪" forKeyPath:@"dogName"];
[rensetValue:@"bmw" forKeyPath:@"dog.dogName"];
4、补讲内容:
1)NSNotification
2)NSNotificationCenter
3)通知三大步骤
4)和KVO的区别
5、NSUserDefaults的定义和使用
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray*arr = @[student.sName, [NSNumber numberWithInteger:student.sAge]];
[arr writeToFile:@"/Users/rimi/Desktop/123.txt" atomically:NO];
[userDefaultssynchronize];
NSArray*arr1 = [NSArray arrayWithContentsOfFile:@"/Users/rimi/Desktop/123.txt"];
[if !supportLists]1) [endif]注意事项
如果程序以外退出,数据不能及时保存到本地,加上synchronize立即写入
2)本地持久化的操作
3)存储数据
第八讲:类目、延展、协议
1、类目、延展的定义和使用
类目:为抑制的类增加新的方法@Category
延展:为自己类的实现文件中添加类目来声明私有方法
@:
//延展 给类添加私有方法或者成员变量
@interface Student____(){//延展的定义格式
//私有成员变量
NSInteger_count;
}
//定义一个私有方法
- (NSString*)returnGenderString;
//私有属性
@property (nonatomic ,strong)NSString *myName;
@end
2、[endif]类目延展的区别和联系
延展是另外一种类目,只不过把类目写在类的实现文件中
4、类目的优势和局限性
类目的优势:1.通过类目加入的方法,与原类没有登记差别
2.可以扩展别人实现的类,而且不需要获得原始类的源代码
3.类目添加的方法,类被继承的时候也一并会被继承
4、协议的定义和使用,协议涉及到的关键字
>协议就是声明一大堆方法,这些方法未于任何类关联
>协议就像一个条款一样,一旦某个对象遵守了这个协议就要实现协议里边的相关方法
>关键字 @protocol
4、代理和协议的区别及联系
>>委托代理(degegate),把某个对象要做的事情委托给别的对象去做,那么别的对象就是这个对象的代理, 代替他来打理要做的事情。反映到程序中,首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。
>>协议声明了可以被任何类实现的方法
协议不是类,它是定义了一个其他对象可以实现的借口
如果在某个类中实现了协议中某个方法,也就是实现了这个那个协议
协议经常用来实现委托对象,一个委托对象是一种用来协同或者代表其他对象的特殊对象。
委托,就是调用自己定义方法,别的类来实现。
6、委托模式的讲解,以及同notification的区别