IOS_Block_定义

[TOC]

Declare

c语言中方法修饰符 ( ) ,如定义一个方法:

int f();

block指针修饰符^
block指针修饰符只能被应用于方法(你不可以写int ^a;这是没有被定义的)
这正是为什么int ^b( )是非法的,并且会造成编译器错误:如果你使用优先级规则来读这个声明,b将会是一个方法,这个方法返回一个指向int类型的block指针。你也知道,并没有这回事儿。所以当你声明一个block时,你总是需要将标识符和修饰符放在圆括号中了

int (^b)();

b是一个block指针,这个指针指向返回int类型的方法。
当然你也可以指定block所需要的参数:

int (^b)(long);
定义一个本地变量
returnType ( ^blockName)(parameterTypes) = ^returnType(parameters){};
例如:
int (^b) (int) = ^int(10){
  ... do some thing
};
定义一个property
@prpperty (nonatomic, copy, nullability) returnType (^blockName)(parameterTypes);
例如:
@prpperty (nonatomic, copy, nullability) int (^b)(double);
作为参数或者返回值

在Objective-C方法中使用blocks作为参数或者返回值,我们需要寻找为那些blocks定义的抽象声明符。我们可以通过移去标识符。

int (^b)( )变成int (^)( ),  int (^b)(long)变成 int (^)(long).
- (void)someMethodThatTakesABlock:(returnType (^nullability)(parameterTypes))blockName;
例如:
- (void) methodWithArgument: (int(^)( )) block;
- (void) anotherMethodWithArgument: (void(^)(long arg1)) block;

这些抽象声明中你不需要为你的block参数取名

作为 typedef:
typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameters) {...};
例如:
typedef void(^failBlock)(NSError *error);
typedef void(^convertToMp4Completed)(void);

 
方法调用:
[someObject someMethodThatTakesABlock:^returnType (parameters) {...}];

refrence from
fuckingblocksyntax.com
objective-c-blocks-syntax
block_usage

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Block基础回顾 1.什么是Block? 带有局部变量的匿名函数(名字不重要,知道怎么用就行),差不多就与C语言...
    Bugfix阅读 6,812评论 5 61
  • 前言 Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这...
    小人不才阅读 3,792评论 0 23
  • Blocks编程要点 目录 简介............................................
    xuejunjun阅读 1,321评论 0 5
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,262评论 30 472
  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 9,955评论 10 69