Objective-C之Block

Block基本概念

本小节知识点:

  1. 【了解】什么是Block
  2. 【理解】block的格式

1.什么是Block

  • Block是iOS中一种比较特殊的数据类型
  • Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛
    • 动画
    • 多线程
    • 集合遍历
    • 网络请求回调
  • Block的作用
    • 用来保存某一段代码, 可以在恰当的时间再取出来调用
    • 功能类似于函数和方法

2.block的格式

  • Block的定义格式
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {

};

  • block最简单形式
void (^block名)() = ^{代码块;}

例如:
void (^myBlock)() = ^{ NSLog(@"李南江"); };
  • block带有参数的block的定义和赋值
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }

例如:
void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
  • 带有参数和返回值的block
返回类型 (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }

例如:
int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
  • 调用Block保存的代码
block变量名(实参);

block和typedef的使用

C语言的指向函数指针用法

#import <Foundation/Foundation.h>

int sum(int value1,int value2)
{
 return value1 + value2;
}
int minus(int value1,int value2)
{
 return value1 - value2;
}
int main(int argc,onst char * argv[])
{
 int (*sumP)(int,int);
 sumP = sum;
 NSLog(@"sum = %i",sumP(20,10));

 int (*minusP)(int,int)
 minusP = minus;
 NSLog(@"minus = %i",minusP(20,10));

 return 0;
}

由于相同的部分可以抽离出来,所以需要使用typedef

#import <Foundation/Foundation.h>

int sum(int value1,int value2)
{
 return value1 + value2;
}
int minus(int value1,int value2)
{
 return value1 - value2;
}

typedef int (*calculte)(int,int)

int main(int argc,onst char * argv[])
{
 calculte sumP = sum;
 NSLog(@"sum = %i",sumP(20,10));

 calculte minusP = minus;
 NSLog(@"minus = %i",minusP(20,10));

 return 0;
}

OC的block的用法

#import <Foundation/Foundation.h>

int main(int argc,onst char * argv[])
{
 int (^sumBlock)(int,int);
 sumBlock = ^(int value1,int value2){
 return value1 + value2;
 };
 NSLog(@"sum = %i",sumBlock(20,10));

 int (^minBlock)(int,int);
 minBlock = ^(int value1,int value2){
 return value1 - value2;
 };
 NSLog(@"min = %i",minBlock(20,10));

 return 0;
}

使用typedef之后:

#import <Foundation/Foundation.h>

typedef int (^calculteBlock)(int,int);

int main(int argc,onst char * argv[])
{
 calculteBlock sumBlock = ^(int value1,int value2){
 return value1 + value2;
 };
 NSLog(@"sum = %i",sumBlock(20,10));

 calculteBlock minBlock = ^(int value1,int value2){
 return value1 - value2;
 };
 NSLog(@"min = %i",minBlock(20,10));

 return 0;
}

block的应用场景

在学习UI之后就会体会到block的好处。

这段代码要多练习,练习到不用看源码就能熟练敲出来。

#import <Foundation/Foundation.h>

void Hello(void (^func)())
{
 NSLog(@"Hello Wrold~");
 func();
 NSLog(@"Hello HeYang~");
}

void sayHello()
{
 Hello(^{
 NSLog(@"Hello World,Hello HeYang~");
 });
}

int main(int argc, const char * argv[]) {
 @autoreleasepool {
 sayHello();
 }
 return 0;
}

举个block应用实例场景:

需求:
 找到需要读取并需要操作的文件
步骤:
 读取文件
 操作文件
 关闭文件
分析:
 其中读取文件和关闭文件都是一样的
 而操作文件,会根据需求而变化,或者根据文件类型而不一样
总结:
 这里就需要使用block把操作文件的功能分离出来。

将Objc的m文件编译成C++文件的终端命令:

cc -rewrote-objc xx.m(OC的m文件)

然后在当前目录下就会出现后缀cpp的C++文件。

block是存储在堆中还是在栈中?
默认情况下block存储在栈中,如果对block进行一个copy操作,block会转移到堆中
如果block在栈中,block中访问了外界的对象,那么不会对对象进行retain操作
但如果是block在堆中,block中访问了外界的对象,那么会对外界的对象进行一次retain

在MRC模式下,我们分析一下是不是会出现内存泄露

Person *p = [[Person alloc]init];
NSLog(@"retainCount = %lu",[p retainCount]);
void (^myBlock)() = ^{
 NSLog(@"a = %@",p);
 NSLog(@"block retainCount = %lu",[p retain]);
}
Block_copy(myBlock);

myBlock();

如果在block中访问了外界的对象,一定要给对象加上__block,只要加上了__block,哪怕block在堆中,也不会对外界的对象进行retain。

加了__block就是地址传递,不加__block是值传递。正因为是值传递,所以可以访问其值,或者return返回其值。

时间: 2024-09-19 23:57:22

Objective-C之Block的相关文章

objective c-怎么避免使用block时 的保留周期?

问题描述 怎么避免使用block时 的保留周期? 如题,怎么样在通过属性定义的NSMutableArray中增加对象? [tapBlockView setTapBlock:^(UIImage* image) { [self.myImageArray addObject:image]; // 保留周期} 如果我创建如下的引用: __weak NSMutableArray *array = self.myImageArray;[tapBlockView setTapBlock:^(UIImage*

objective c-认证ios中的block

问题描述 认证ios中的block 在IOS中,可以使用 void*,id 或者 NSObject* 代表对象实例. 有没有方法代表ios Block?谢谢 解决方案 Block其实相当于其它一些高级语言中的"匿名函数".Block的作用是"可以将方法作为方法的参数".在一个方法中如果要传递参数,在定义方法时需要指明方法的参数类型,但有时我们想将一个方法来作为定义的方法中的参数,这时我就要用到Block了.而你问的问题"有没有方法代表ios Block?&

全面解析Objective-C中的block代码块的使用_IOS

1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由

CSS魔法堂:不得不说的Containing Block

前言  <CSS魔法堂:重新认识Box Model.IFC.BFC和Collapsing margins>中提到在没有floated兄弟盒子时,line box的左右边框会与所属的containing block的左右content edge相接触.那到底什么是containing block(abbr. CB)呢? containing block在CSS的visual formatting model中十分重要的理论基础,因为盒子的宽/高度自动值/相对值的计算,相对/浮动/绝对定位,均依赖

ARC中block块作为属性的使用笔记

ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究过为什么会泄露吗?为什么有些时候外部变量进入block的时候会导致引用计数+1呢?   本人做过MRC以及ARC的开发,但大势所趋,ARC将是以后开发的主要模式,即使有MRC也是ARC混编MRC的代码,所以,本文的block的一些使用上的心得都基于ARC的,已经不考虑MRC的了,请看官注意,MRC与

ARC下block使用情况

ARC与MRC的block有着一些区别,笔记整理ARC的block,仅仅是自己参考的笔记,详情请参考 http://www.cnbluebox.com/?p=255   在开始之前,请新建一个Model类,写几个如下的属性,用于后面测试block的特性.     Block的类型与内存管理 根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock. NSGlobalBlock:类似函数,位于text段: NSStackBlock:

UIButton的两种block传值方式

UIButton的两种block传值方式 方式1 - 作为属性来传值 BlockView.h 与 BlockView.m // // BlockView.h // Block // // Created by YouXianMing on 15/1/14. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> @class BlockView; /** 定义枚举值 */ typed

CSS教程:block element与inline element元素详解

块元素(block element)一般是其他元素的容器元素,块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签'P"."form"这个块元素比较特殊,它只能用来容纳其他块元素. 如果没有css的作用,块元素会顺序以每次另起一行的方式一直往下排.而有了css以后,我们可以改变这种html的默认布局模式,把块元素摆放到你想要的位置上去.而不是每次都愚蠢的另起一行.需要指出的是,table标签也是块元素的一种,table based layout和css

块(Block),元素(Element),修饰符(Modifier)

文章简介:BEM代表块(Block),元素(Element),修饰符(Modifier).这些术语的含意将在本文进一步阐述. 什么是BEM? BEM代表块(Block),元素(Element),修饰符(Modifier).这些术语的含意将在本文进一步阐述. 编程方法论中一个最常见的例子就是面向对象编程(OOP).这一编程范例出现在许多语言中.在某种程度上,BEM和OOP是相似的.它是一种用代码和一系列模式来描述现实情况的方法,它只考虑程序实体而无所谓使用什么编程语言. 我们使用BEM的原则创建了

内联元素(inline element)和块元素(block element)

文章简介:CSS里有哪些常见的块级元素和行内元素?  根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为"block",成为"块级"元素(block-level):而span元素的默认display属性值为"inline",称为"行内"元素. div这样的块级元素,就会自动占据一定矩形空间,可以通过设置高