黑马程序员——Objective-C——protocol、Block

-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----

一、protocol简单使用

  1>基本用途

    1.可用来声明方法。

    2.只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明。

    3.只要父类遵守了这个协议,就相当于子类也遵守了。

  2>格式  

    1.协议的编写  

@protocol 协议名称
    //方法声明列表
@end

     2.类遵守协议

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

  3>关键字

    协议中有2个关键字可以控制方法是否要实现默认是@requied。

      1>@required:标识方法必须要实现(如果不实现,编译器会发出警告)。

      2>@optional:标识方法不一定要实现。

  4>协议遵守协议

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

    一个协议遵守了其它协议,就相当于拥有了其它协议方法的声明。

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

   5>基协议

    NSObject是一个基类,任何其它类的根类都要继承它。

    NSObject也是一个协议。

  6>定义变量时指定协议

    //NSObject类型对象,遵守NSCopying协议

    NSObject<NSCopying> *obj;

    //任何OC对象,要遵守NSCoding协议

    id<NSCoding> obj;

二、protocol代理设计模式

  1>设计原理

    有些事情不想自己做,就可以找人帮忙做,就是找代理人去做。

  2>设计原则

    首先得拥有某个对象的属性。

    其次要很清楚代理有什么功能。

    最后能保证解耦。

  3>实现方案

    定义一个protocol,在其中声明一些和代理沟通的方法。

    拥有一个代理属性id<protocol>delegate。

    让代理遵守协议。

三、protocol示例代码

#import <Foundation/Foundation.h>


@protocol proTicket <NSObject>
  //票价
  - (double) ticketPrice;
  //剩余票数
  - (int) beLeftTicket;
@end

@interface agent:NSObject <proTicket >
   
@end
@implementation agent
 //票价
  - (double) ticketPrice
  {
       return 99;
  }
  //剩余票数
  - (int) beLeftTicket
  {
     return 100;
  }
@end

@interface person:NSObject
- (void) buyTicket;
@property (nonatomic, retain) id<proTicket> delegate;
@end

@implementation person

// 买票
- (void)buyTicket
{
    double price = [_delegate ticketPrice];
    int number =  [_delegate beLeftTicket];
    NSLog(@"通过代理买票,票价:%f,剩:%d张票", price, number);
}

- (void)dealloc
{
    [_delegate release];
    [super dealloc];
}

@end

int main()
{
     //人
    person *p = [[person alloc] init];
    // 代理
    agent *a = [[agent alloc] init];
    //设置人的代理
    p.delegate = a;
    //买票
    [p buyTicket];
    [a release];
    [p release];
}

 四、Block

  1>简介

    1.Block封装了一段代码,可以在任何时候执行。

    2.Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。

    3.苹果官方建议尽量多用Block,在多线程、异步任务、集合遍历、集合排序、动画转场中用的多。

  2>定义示例

int (^Sum)(int, int) = ^(int a, int b) {
	return a+b;
};

上面示例:定义了一个叫Sum的block对象,它带有量个参数,返回int,等式右边就是Sum的具体实现,Block可以访问局部变量,但不能修改,除非局部变量加上关键字"__block"。

__block int sum=10;
int (^c)(int) = ^(int num) {
	sum++;//编译报错
	return num * sum;
};
c(10);

   3>block和函数指针对比

    1.定义函数指针

      int (*sum)();

    2.调用函数指针

      (*sum)();

    3.定义block

      int (^sum)(int,int);

    4.调用block

      sum(10,20);

  4>声明与赋值(2种方式)

//声明的同时赋值
int (^sum)(int,int)=^(int a,int b)
{
     return a+b;
}
//声明之后在赋值
#typedef int (^sum)(int,int);

sum s=^(int a,int b)
{
    return a+b;
}

 

转载于:https://www.cnblogs.com/comcn/p/4356678.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值