自学OC的第三天

272 阅读2分钟

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变量名(参数列表);

注意:

  1. 在block代码块的内部可以拿到定义在外部的变量的值,包括定义在外部的局部变量和全局变量。
  2. 在block代码块的内部可以修改全局变量的值,但是不能修改定义在外部的局部变量的值。
  3. 如果需要局部变量在代码块的内部进行修改,需要在变量前加__block修饰符。

objective-c的基础内容到此基本上学习完毕了,接下来会对于OC和C的区别进行一次辨析。