Block语法(1)

  1. 为什么要使用block。

我们知道,对象与对象之间的通信方式有以下三种:1、代理-协议;2、通知;3、block。三种方式都实现了对象之间的解耦合。其中不同就是:通知的通信方式是1对多;代理、block的通信方式是1对1.

  2.Block的简介。

  • Block是iOS4.0之后新增的一种语法结构,也成为“闭包”。
  • SDK4.0新增的API大量使用了block
  • Block是一个匿名的函数代码块,此代码块可以作为参数传递给其他对象。

  3. Block的使用

//int 是返回值;sumBlock 是Block变量类型;(int x,int y)括号里面是参数。
int(^sumBlock)(int x,int y);

 

 1 //创建 myBlock
 2 - (void)createMyBlock {
 3     //定义block变量
 4     int(^sumBlock)(int x,int y);
 5     //实现block,并且赋值
 6     sumBlock = ^(int x,int y){
 7         return x + y;
 8     };
 9     //声明myBlock变量,全局{int(^myBlock)(int x,int y);}
10     myBlock = sumBlock;
11     NSLog(@"%d",myBlock(20,20));
12 }

 4. 创建Block

Block有以下4种方式:

 1 //Block是匿名函数,无法通过函数名调用,所以单独使用没有意义
 2 //  1.无参数  无返回值--与直接打印数据是一样的效果,无意义
 3     ^(){
 4         NSLog(@"无参数  无返回值");
 5     }();
 6
 7 //  2.有参数 无返回值
 8     ^(int a,NSString* text){
 9         NSLog(@"%d \n %@",a,text);
10     }(10,@"有参数  无返回值");
11
12 //  3.有返回值  无参数
13     NSString* a = ^(){
14         return @"无参数  有返回值";
15     }();
16     NSLog(@"%@",a);
17
18 //  4.有参数  有返回值
19     //定义block变量
20     int(^sumBlock)(int x,int y);
21     //实现block,并且赋值
22     sumBlock = ^(int x,int y){
23         return x + y;
24     };
25     NSLog(@"%d",sumBlock(10,10));
26 }
1 //有参数 有返回值(返回结果是 6 )
2     int(^powefBlock)(int x,int y);
3     powefBlock = ^(int x,int y){
4         return x * y;
5     };
6     NSLog(@" powef = %d",powefBlock(2,3));

  5. Bloc和变量

  • 变量按作用可以分为全局变量和局部变量。
  • block中可以使用这两种变量,但是有不同的管理机制。

引用局部变量

  • block引用局部变量时候,改变量会作为常量编码到block块中。
  • 局部变量需要使用__block修饰,才能在block中修改。
 1 //      如果在block 代码内部,使用外部变量时,number会变为常量
 2     int  number = 10;
 3     ^(){
 4     //number = 20; 直接报错 ---不可以修改,已经变为常量
 5         NSLog(@"%d",number);
 6     }();
 7
 8 //--在内部改变-
 9   //在变量前加__block 声明即可
10     __block int  number_1 = 10;
11     ^(){
12         number_1 = 20;
13         NSLog(@"%d",number_1);
14     }();
  • 引用外部变量
#import <Foundation/Foundation.h>

@interface MyObject : NSObject
{
    //block 引用外部 成员变量
    int _number;
}
- (void)log;

@end
 1 - (void)log {
 2
 3 //      block 引用外部 成员变量
 4     _number = 99;
 5     NSLog(@"---%ld-- ",self.retainCount);
 6 //  使用block 修饰obj 对象  这样obj 在block中使用不会被retain。
 7 //  obj 不能拥有 self 的所有权   block不会持有self对象
 8     __block MyObject* obj = self;
 9     ^(){
10         //    判断 obj 是否存在
11         if (!obj) {
12             return ;
13         }
14         //通过obj 获取成员变量;打印结果是 1
15         int a = obj -> _number;
16         NSLog(@"---%d-- ",a);
17         NSLog(@"*****%ld**** ",self.retainCount);
18     }();
19
20 }

  6. Block的内存管理

  • 在block里面引用一个局部的Objective-C对象的时候,该对象会被retain。
  • 如果局部变量使用__block修饰,则不会被retain。
 1 //--------引用外部obj对象的时候----------
 2 //不会被retain,即obj1.retainCount始终是1
 3 //__block NSObject* obj1 = [[NSObject alloc] init];
 4 //延时调用以后,obj1.retainCount会变为2
 5     NSObject* obj1 = [[NSObject alloc] init];
 6     NSLog(@"%ld",obj1.retainCount);
 7
 8     //延时调用
 9     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
10         NSLog(@"%ld",obj1.retainCount);
11     });
  • block本身可以像对象一样copy和release
  • block创建后内存是分配在栈上,调用copy方法之后,将block移动到堆中。
  • 当block声明为全局变量时候,应该调用block的copy方法。

  7. 循环引用

  • 在block(点语法)里面引用一个实例变量的时候,改实例变量会被retain。
  • 如上规则容易导致循环引用,造成内

欢迎读者查阅,如若转载,请标明出处。

时间: 2024-12-24 10:20:34

Block语法(1)的相关文章

obj-c8[block语法]

Block语法  块语法,本质上是匿名函数(没有名称的函数)C++.JS.Swift等语言,有类似语法,叫做闭包 //Block 的作用,主要是用于回调函数,解耦合 //当方法的参数是block类型,block的参数用户从内向外传值;block的返回值,用于,从外向内返回结果 #import <Foundation/Foundation.h> #import "XunleiDownload.h" #import "LoginManager.h" #imp

从C语言的变量声明到Objective-C中的Block语法转载]

原文:From C Declarators to Objective-C Blocks Syntax 作者:Nils Hayat 译者:CocoaChina--sunshine 在这篇文章中,从简单的C语言中各种声明开始,以及复杂的声明组合,到最后Objective-C中的代码块bokck的语法. 花一些时间去了解代码块(block)衍生和组织形式,一旦明白了这些,就可以很方便的声明和使用它,而不用每次需要的时候才去Google一下. 如果你想把能想到的东西用block声明表现出来,请继续阅读!

OC --(6)-- Block、数组高级:Block语法、Block使用、Block实现数组排序

1.Block定义 Block:块语法,本质上是匿名函数(没有名称的函数) 标准C?里?面没有Block,C语言的后期扩展版本,加入了匿名函 数. C++.JS.Swift等语?言,有类似语法,叫做闭包. Block语法和函数指针很相似.

Block 语法练习

//函数是具有特定功能的代码段 //一个严格的函数, 包括函数声明, 函数定义, 函数调用 //block块儿语法, 是在函数内部,定义一个block, block块执行效率比较高 //函数指针指向函数首地址, 这样指针就可以调用函数 //函数指针类型的重命名 //typedef 函数返回值类型(*新函数名) () //block块儿语法 //返回值类型(^块儿语法名)(参数类型1, 参数名1 参数类型2, 参数名2, ....)() //参数类型与参数名之间用空格隔开, 两个参数之间用逗号隔开

OC中Block语法、Block使用以及通过Block实现数组排序

Block:语法块,本质上是匿名函数(没有名称的函数) 标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数 在C++.JS.Swift等语言有类似语法,叫做闭包 Block语法和C语言里的函数指针很相似,下面我们先来回顾下C语言中的函数和函数指针 C语言中函数是指:实现某一功能的代码段 完整的函数包括两部分:函数声明.函数定义 函数声明,即函数原型.例如:int sum (int x,int y);具有两个整形参数,一个整形返回值的函数 函数定义,即函数实现.例如:int sum(i

块语法Block在MVC思维的妙用之多重M层代理传值

注:以下代码均来自真实项目案例. 在项目开发中,经常避免一些与系统工具交互的功能需求.比如说开启蓝牙,开启相机,通讯录功能,还有数据加密等等. 由于这些功能的实现没有实例化的必要,并且又是许多项目都共用的功能,所以一般我们会作为类的静态方法去作为自己的工具类. 以下是一段将字典的键值对导入通讯录的静态方法代码. 假如说现在有一个这样的逻辑流程,C层按钮交互,将页面某个数据加密导入通讯录. 让我们以MVC的思维梳理一下整过流程. 在这整个事件中,有三个参与者.页面(C层),加密(M层),通讯录导入

Objective-C Block方法与笑笑语法

#pragma mark - block语法 NSLog(@"========block方法1==========="); [students sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { Student *stu1 = (Student *)obj1;//这里的obj1就是Student类型的 Student *stu2 = (Student *)obj2; NSLog(@"%ld",[st

Block内存管理实例分析

在ios开发中,相信说道block大家都不陌生,内存管理问题也是开发者最头疼的问题,网上很多讲block的博客,但大都是理论性多点,今天结合一些实例来讲解下. 存储域 首先和大家聊聊block的存储域,根据block在内存中的位置,block被分为三种类型: NSGlobalBlock NSStackBlock NSMallocBlock 从字面意思上大家也可以看出来 NSGlobalBlock是位于全局区的block,它是设置在程序的数据区域(.data区)中. NSStackBlock是位于

关于Block初识与自己的认识

前些天学到了Block,对于Block有了一些大致的认识 Block是什么? 我认为是一些行为的封装  举个例子  要将两个参数进行加减乘除    创建4个Block实现价钱乘除四个操作即可   用一个方法  传两个参数和一个block  返回就是block对这两个参数的操作 代码演示 1 #import <Foundation/Foundation.h> 2 #import "Calc.h" 3 int main(int argc, const char * argv[]