OC-block
- #import <Foundation/Foundation.h>
- /*
- block要掌握的东西
- 1> 如何定义block变量
- int (^sumBlock)(int, int);
- void (^myBlock)();
- 2> 如何利用block封装代码
- ^(int a, int b) {
- return a - b;
- };
- ^() {
- NSLog(@"----------");
- };
- ^ {
- NSLog(@"----------");
- };
- 3> block访问外面变量
- * block内部可以访问外面的变量
- * 默认情况下,block内部不能修改外面的局部变量
- * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
- 4> 利用typedef定义block类型
- typedef int (^MyBlock)(int, int);
- // 以后就可以利用MyBlock这种类型来定义block变量
- MyBlock block;
- MyBlock b1, b2;
- b1 = ^(int a, int b) {
- return a - b;
- };
- MyBlock b3 = ^(int a, int b) {
- return a - b;
- };
- */
- typedef int (*SumP)(int, int);
- typedef int (^MyBlock)(int, int);
- int sum(int a, int b)
- {
- return a + b;
- }
- int main()
- {
- // int (*p)(int, int) = sum;
- // int (*p2)(int, int) = sum;
- // SumP p = sum;
- // SumP p2 = sum;
- /*
- int (^sumBlock)(int, int);
- sumBlock = ^(int a, int b) {
- return a + b;
- };
- int (^minusBlock)(int, int) = ^(int a, int b) {
- return a - b;
- };*/
- MyBlock sumBlock;
- sumBlock = ^(int a, int b) {
- return a + b;
- };
- MyBlock minusBlock = ^(int a, int b) {
- return a - b;
- };
- MyBlock multiplyBlock = ^(int a, int b) {
- return a * b;
- };
- NSLog(@"%d - %d - %d", multiplyBlock(, ), sumBlock( , ), minusBlock(, ));
- return ;
- }
- void test3()
- {
- int a = ;
- __block int b = ;
- void (^block)();
- block = ^{
- // block内部可以访问外面的变量
- //NSLog(@"a = %d", a);
- // 默认情况下,block内部不能修改外面的局部变量
- // a = 20;
- // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
- b = ;
- };
- block();
- }
- // 有返回值、有形参的block
- void test2()
- {
- /*
- // 指针函数的指针
- int (*p)(int, int) = sum;
- int d = p(10, 12);
- NSLog(@"%d", d);
- */
- int (^sumblock)(int, int) = ^(int a, int b){
- return a + b;
- };
- int c = sumblock(, );
- // 用一个block输出n条横线
- void (^lineBlock)(int) = ^(int n)
- {
- for (int i = ; i<n; i++) {
- NSLog(@"----------------");
- }
- };
- lineBlock();
- }
- // 没有返回值、没有形参的block
- void test()
- {
- // block用来保存一段代码
- // block的标志:^
- /*
- block跟函数很像:
- 1.可以保存代码
- 2.有返回值
- 3.有形参
- 4.调用方式一样
- */
- // 定义block变量
- /*
- void (^myblock)() = ^(){
- NSLog(@"----------------");
- NSLog(@"----------------");
- };*/
- // 如果block没有形参,可以省略后面的()
- void (^myblock)() = ^{
- NSLog(@"----------------");
- NSLog(@"----------------");
- };
- // 利用block变量调用block内部的代码
- myblock();
- myblock();
- }
- Block封装了一段代码,可以在任何时候执行
- Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
- 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
Blocks的定义:
- int (^MySum)(int, int) = ^(int a, int b) {
- return a+b;
- };
定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现
Block可以访问局部变量,但是不能修改。
- int sum = ;
- int (^MyBlock)(int) = ^(int num) {
- sum++;//编译报错
- return num * sum;
- };
如果要修改就要加关键字:__block
__block int sum = 10;
Blocks和函数指针对比:
- 定义函数指针 int (*myFn)();
- 定义Blocks int (^MyBlocks)(int,int);
- 调用函数指针 (*myFn)(10, 20);
- 调用Blocks MyBlocks(10, 20);
Blocks的赋值
int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};
OC-block的更多相关文章
- Swift3.0 函数闭包与OC Block
刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...
- OC Block网上转载
1.block是一个特殊的OC对象, 它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量. 2.默认情况下block使用到的局部变量都会被复制,而不是保留.所以它无法改变局 ...
- OC BLOCK和协议
一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. block实际上是: 指向结构体的指针 BOLC ...
- OC block的简单使用
http://blog.csdn.net/itpeng523/article/details/23965147 一.先用Xcode创建一个空工程 学习block之前先用弄懂c语言的函数指针 看代码: ...
- iOS - OC Block 代码块
前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...
- oc block基本使用
// // main.m // block基本使用 // // Created by Ymmmsick on 15/7/21. // Copyright (c) 2015年 Ymmmsick. All ...
- [OC] Block的使用
由ControllerA跳转到controllerB,在controllerB中选择一个参数的值,并将它传回给controllerA. 首先,在controllerB的.h文件中写入: @interf ...
- OC Block(代码块)
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- OC block声明和使用
#import "Button.h" typedef int (^MySum) (int, int); void test() { // 定义了一个block,这个block返回值 ...
- oc block 遍历数组及字典
原遍历数组NSArray * lines = ...for (NSString * line in lines) { // ...}for (int i = 0; i < lines.count ...
随机推荐
- java:提示Could not initialize class sun.awt.X11GraphicsEnvironment
前几天发现tomcat提示 Could not initialize class sun.awt.X11GraphicsEnvironment 问题.以为不验证,就没太关注,今天发现,有同事提示了个 ...
- ajax技术应用(转)
ajax简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不 ...
- 安装python-docx
安装环境: windows 7 64位 python 3.4.2 64位 说明: 用pip install python-docx不行,当装lxml时出现错误,一直卡在那. 安装非官方的版本,如下图, ...
- 如何在iOS9的plist文件中配置不使用https
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Te ...
- [学习笔记]概率&期望
概率的性质 非负性:对于每一个事件$A,0\;\leq\;P(A)\;\leq\;1$. 规范性:对于必然事件$S,P(S)=1$;对于不可能事件$A,P(A)=0$. 容斥性:对于任意两个事件$A, ...
- 【caffe】无法找到gpu/mxGPUArray.h: No such file or directory
@tags: caffe 问题出现在,windows下编译caffe的过程中.按照github.com/microsoft/caffe的readme配置的. 问题原因是,用的matlab版本较新(20 ...
- nand以及yaffs2
用的是tiny210+1312的SDK,友善之臂给的文件系统居然有300多兆,烧写系统可是要人命了,那个等啊...所以,想着把系统给做小一点.和其他一样,我的知识仅限于理论阶段,嘿嘿.今天实践一下. ...
- fabric note
#!/usr/bin/env python # -*- coding:utf-8 -*- from fabric.api import * from fabric.context_managers i ...
- [IOS swift对比oc]
http://www.cocoachina.com/industry/20140605/8686.html WWDC 2014上苹果再次惊世骇俗的推出了新的编程语言Swift 雨燕, 这个消息会前没有 ...
- django admin中保存添加的数据提示need string or buffer, int found
原因 def __unicode__(self): return unicode(self.pk) 此处如果没有unicode就会报这个错误,原因就是编码错误 以为是文件开始没有加utf-8导致的,然 ...