day3
协议 protocol
在objective-c中,协议是一个方法列表。可以规定一个协议中必需的部分和可选的部分。但是注意,不能进行实现。类似java中的接口。
使用方法:
@protocol ProtocolSuiteA<otherProtocol>
@required
//必需的方法写在这个位置
@optional
//可选的方法写在这个位置
@end
@interface interfaceA:superClass<ProtocolSuiteA>
//Method Code.......
@end
//main.m--------------------------------------------
int main(int argc,const char * argv[]){
NSObject<ProtocolSuiteA,ProtocolSuiteB...> *obj = [interfaceA new]; //类似范型
id<ProtocolSuiteA,ProtocolSuiteB...> id = [interfaceA new];
}
id<ProtocolSuiteA> myVariable; //表示myVariable是遵循ProtocolSuiteA协议的。
- (void) doSomeThingWithThisObject:(id<ProtocolSuiteA>)aObject; //表示这个函数的参数需要遵循ProtocolSuiteA这个协议
用协议实现委托
目的:将A的事情委托给B来做
step1 : 在A中声明协议,也就是要委托出去的事情。
step2 : A中声明一个委托对象,也即是要委托出去的方法。
step3 : 如果想要B做A的事情,那么需要在B的interface中声明遵循A中制定的那个协议
step4 : A调用委托执行那件事情,即[delegate fun]。
eg.
//A.h------------------------------------------------
@protocol Mydelegate//协议的声明
-(void)Fun;
@end
@interface A:NSObject
{
id<Mydelegate> delegate;//声明一个委托对象,我们要把事情委托给实现Mydelegate协议的类
}
@property(assign,nonatomic) id<Mydelegate> delegate;
@end
//A.m---------------------------------------------
@implementation A
-(void)init
{
delegate = B;
}
-(void)FunToOther
{
[delegate Fun];//将消息发送给委托去处理
}
@end
//委托对象的实现
//B.h---------------------------------------------
#import"A.h"
@interface B:NSObject<MyDelegate>
@end
//B.m---------------------------------------------
@implementation
-(void)Fun
{
//实现Mydelegate中制定的方法
}
@end
Block
block是一个数据类型,用于专门存放一段代码,这段代码可以有参数、有返回值。有点类似匿名类的感觉。
声明方法:
在声明block变量的时候必须要指定这个block变量存储的代码段是否有参数,是否有返回值。一个block变量只能存放相应的代码段。
返回值类型 (^block变量名)(参数列表);
eg.
int (^myBlock1)(int num1,int num2);
初始化:
^返回值类型(参数列表){
代码段;
};
使用方法:
block变量名(参数列表);
注意:
- 在block代码块的内部可以拿到定义在外部的变量的值,包括定义在外部的局部变量和全局变量。
- 在block代码块的内部可以修改全局变量的值,但是不能修改定义在外部的局部变量的值。
- 如果需要局部变量在代码块的内部进行修改,需要在变量前加__block修饰符。
objective-c的基础内容到此基本上学习完毕了,接下来会对于OC和C的区别进行一次辨析。