美文网首页大神ios
关于block的记录

关于block的记录

作者: 石丘 | 来源:发表于2015-07-31 18:03 被阅读85次

认识block


block和函数很相似所以可以对比函数看一下 (不拿函数指针对比了看着晕)
带参数带返回值的例子 函数声明:
int sum (int a,int b) int (^sum) (int a,int b)
很明显基本一样的 就是多了一个block的标志^然后把函数名括起来了

函数和block的对比
都是保存一段代码 用来执行
int main(){ //在函数中执行的时候就是一模一样的调用 sum(1,2);//函数 sum(1,2);//block }
不同的地方是保存代码块的书写方式是不同的
int sum (int a,int b){int s = a+b; return s;}
int (^sum)(int a,int b)=^(int a,int b){int s = a+b; return s;}
最重要的是 block是可以在函数内部保存代码块 函数只能在外面

block的书写


blcok的typedef比较特殊直接这么写一句就可以了:
typedef int (^Sum)(int, int); Sum sum;
然后就可以去定义这种类型的block了
sum =^(int a,int b){int s = a+b; return s;}
写的时候好看一点了 用的时候是一样的
sum(1,2);
block回调 block事先保存一段代码恰当的时候拿出来调用

__block int a = 10;
    // 定义Block变量
void(^MyBlock)()=^{
        NSLog(@"执行任务");
    a=20;
};
// 调用Block内部代码
    MyBlock();
//在执行一次
    MyBlock();

1.在定义block的时候 如果引用了外部变量 会对外部变量做一个copy 
记录住定义block的时变量的数值
如果后续再修改x的值 不会影响block内部的数值变化

2.如果要在block中 修改外部变量的数值 需要使用__block修饰符号 
定义block时 如果外部使用__block的变量 
block定义之后 外部变量的指针地址同样会变成堆区的地址

//inlineBlock
 returnType(^blockName)(parameterTypes) = ^(parameters) {
        statements
    };

2.关于解决循环引用的问题


block被强引用而且block里面有强引用属性的时候会存在循环引用的问题
我们把block里面的强引用改成弱指针就可以了
_unsafe_unretained viewController*shre = self
__weak viewController*shre = self
__weak typeof(self) share = self

typedef void (^BoolBlock)(BOOL);
一个只接受一个BOOL参数,没有返回值的block
typedef int (^IntBlock)(void);
一个没有参数,返回int的block
typedef BoolBlock (^HugeBlock)(IntBlock);
看看,这个HugeBlock的参数和返回值都是block

3.下面是一个block应用例子


写一个带block的方法 并调用此方法
<code>
typedef void (^IsScuess) ();
@property (nonatomic, copy) IsScuess isScuess;

//写方法
-(void)addDeviceModel:(DeviceModel*)Model IsScuess:(IsScuess)isScuess{
[self.backView makeToastActivity];
isScuess();
}
//调用
[self addDeviceModel:model IsScuess:^{
if ([[DeviceDataManage sharedManager] addDeviceWithModel:model]) {
[share.backView hideToastActivity];
[share.backView makeToast:@"添加成功"];
}else{
[share.backView hideToastActivity];
[share.backView makeToast:@"设备重复"];
}}];</code>

然后对比下系统的带block的方法
+(void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

尾记:感谢麻友三万等童鞋提供的支持😄


W0CYUJT51S%{SVA@F41KAG9.jpg 9MFG`JOD3W$_`4SP(UIIED2.jpg

![@Z{07P]6E3VXC`P]N0N)NY5.jpg](http:https://img.haomeiwen.com/i301562/dc438862fd804179.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

![7NW1{44ZXYDF`NB@G7{@]3U.jpg](http:https://img.haomeiwen.com/i301562/881a98fa4bfb23d9.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1240)
就是你 菊花 的地方价格 handler
然后结束的时候调用下handler就行了

黑幕背后的__block修饰符
内存管理——如何验证block在栈上,还是堆上

相关文章

  • 关于block的记录

    认识block block和函数很相似所以可以对比函数看一下 (不拿函数指针对比了看着晕)带参数带返回值的例子 函...

  • Objective-C运行时原理(四):Block

    关于block的语法,请使劲戳这里→fuckingblocksyntax.com 这篇文章只记录一下block的实...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • 关于Block一些记录

    大概两三周前通过学习《Objective-C高级编程 iOS与OS X多线程和内存管理》中的Block章节,系统深...

  • Block记录- 修改Block

    iOS开发中,block是很常见的用法,也是面试很常见的问题点。最近在看到一篇很棒的文章,自己也做了实践。截图记录...

  • 详细的探讨一下Block(讨论篇、基础篇、实质篇)

    章节目录 关于Block的讨论篇 Block的基础篇 Block的实质篇 讨论篇: 为什么要看Block? 为了更...

  • block 记录

    2015年12月11日星期五 block 的性质 block与delegate的区别说到底,block是函数(转码...

  • block记录

    做自由变量: 传值 和 传址 __block 打印:定义前:0x7ffee136e728定义后:0x6000000...

  • 关于block(4)

    关于block(4) 标签: iOS 技术 接上篇,我们继续探究block。 block的copy属性 研究到这里...

网友评论

    本文标题:关于block的记录

    本文链接:https://www.haomeiwen.com/subject/tlfvqttx.html