您的位置:首页 > 移动开发 > Objective-C

黑马程序员—Objective-C基础_block、协议

2014-03-27 00:12 405 查看
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流!
----------------------


block


封装一段代码,可以在任何时间执行

block声明

int (^Sum)(int,int);
block定义

int (^Sum)(int,int) = ^(int a,int b){

    return a + b;


定义一个block类型的变量,接收两个整型数据a,b,返回a+b的值
在block内部可以访问外部的变量,默认情况下,block内部不能修改外部的局部变量

如果需要修改局部变量的值,需要在局部变量的定义前加上__block关键字

利用typedef定义block类型
typedef int (^MyBlock)(int,int);

MyBlock b;

b = ^(int a,int b){

    return a + b;

}

block的使用

// 自定义一个block类型MyBlock
typedef int(^MyBlock)(int,int);

int main()
{
    int a,b;
    a = 10;
    b = 10;
    __block int c;
    // 定义block类型的变量block
    MyBlock block = ^(int num1,int num2){
        // 调用外面局部变量
        c = 5;
        // block内可以访问外面的局部变量
        num1 = a+c;
        return num1 + num2;
    };
    // 调用block
    block(a,b);

    return 0;
}

block的用法和函数很像:

可以保存代码,有返回值,有形参,调用的方法也一样。

@protocol协议
用来声明大量方法,只要某个类遵守这个协议,就能拥有此协议中所有的方法声明。只要父类遵守某个协议,子类也遵守此协议。

协议的使用方法

@protocol 协议名称

// 方法列表

@end 
@interface 类名 : 父类<协议名称>

@end 

协议中的关键字

@required:表示方法必须实现,不是想,编译器会发出警告

@optional:表示方法不一定要实现

协议遵守协议

一个协议可以遵守其他多个协议,多个协议之间用逗号隔开

一个协议遵守了另一个协议,就相当拥有了该协议中的方法声明

@protocol 协议名称<协议1,协议2>

@end

基协议

NSObject是一个基类,任何类都继承自它。

NSObject也是一个基协议,最基本的协议。包括很多最基本的方法的声明,如:description、retain、release等

每个西恩的协议都要遵守基协议NSObject。

定义变量时指定变量要遵守的协议,如果不遵守相应的协议,编译器就会发出警告。

类名<协议名称> *变量名;

定义成员变量遵守协议

@property (noatomic,strong) 类名<协议名称> *属性名;

协议可以定义在单独的.h文件中,也可定义在某个类中。

如果协议只用在某个类中,应该把协议定义在该类中。

如果协议用在很多类中,则定义在单独的文件中。

协议的简单应用

#import <Foundation/Foundation.h>
// protocol1继承了基协议
@protocol protocol1 <NSObject>
@optional// 表示run方法不一定要实现
- (void)run;
@end
// protocol2协议 继承自protocol1协议
@protocol protocol2 <protocol1>
@required// 表示eat方法必须实现
- (void)eat;
@end
// 创建一个类Person遵守协议protocol2
@interface Person : NSObject<protocol2>

@end
@implementation Person
// 协议要求必须实现eat方法
- (void)eat
{
    NSLog(@"吃了一顿");
}
@end

int main()
{
    // 创建了一个对象,遵守协议protocol2
    NSObject<protocol2> *p1 = [[Person alloc] init];
    
    // [p1 run]; run方法没有实现,运行程序会出错,但是调用run方法,编译器不会报错
    [p1 eat];
    
    NSObject<protocol1> *p2 = [[Person alloc] init];
    
    // [p2 eat]; // p2遵守protocol1协议,无法调用eat方法
    
    return 0;
}

 

协议可以定义在单独的.h文件中,也可定义在某个类中。如果协议只用在某个类中,应该把协议定义在该类中;如果协议用在很多类中,则定义在单独的文件中。

 ---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流!
----------------------

详细请查看:http://edu.csdn.net 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: