澳门威利斯人_威利斯人娱乐「手机版」

来自 网络资讯 2020-03-18 04:47 的文章
当前位置: 澳门威利斯人 > 网络资讯 > 正文

block三种应用场景,iOS函数编程和链式编程

  • 1.把block保存成对象中的属性,在适用的随即调用
inlineBlock:快速生成block代码
block其实就是一个对象:苹果文档有解释。

使用clang指令
clang -rewrite-objc main.m 
得到一个cpp文件

你定义完block之后,其实是创建了一个函数,在创建结构体的时候把函数的指针一起传给了block,所以之后可以拿出来调用。

其实不佳意思,标题起的太大了,这里只是对Masnory的兑现仿照写二个最简便易行的demo.把落到实处思路简单门船演讲一下,协作进步

图片 11.png


各位朋友:源码在demo,能够去看看.
  • 2.把block当成方法的参数使用,block的调用在是在点子内部,在外场写block的实现

    图片 22.png

  • 3.把block当成方法的重回值

    图片 33.png

结论:

在Masonry中,完成是这么写的:

 UIView *v = [[UIImageView alloc]init]; v.backgroundColor = [UIColor redColor]; [self.view addSubview:v]; //使用 Masonry 设置 [v mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.view).offset; make.bottom.mas_equalTo(self.view).offset; make.left.mas_equalTo(self.view).offset; make.right.mas_equalTo(self.view).offset; }]; 

大家想要达成的职能是:

  1. 咱俩在接受进程中须求先实施A方法,再进行B方法,或然先执行B方法,再推行A方法,连写在合作,就是链式编制程序
[[某实例对象 A方法] B方法];

或者是:

[[某实例对象 B方法] A方法];

2.在OC中 调用艺术都以利用 中括号'[]', 使用小括号'(卡塔尔国'的在OC 中是 block,调用block时候用,函数编程

//调用blockblock();//最后实现的效果是:某实例对象.A方法;或者是:某实例对象.B方法;

示例1

1.在Person类中

@interface Person : NSObject@property (nonatomic,strong) void;@end

2.在ViewController类中

- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ int a = 12; int b = 11; Person *p = [[Person alloc] init]; p.myBlock;}
block在MRC下使用copy,在ARC下使用strong和copy一样,尽量用strong。
>
block修饰的变量存放的位置:
在MRC和ARC下:
    block没有使用局部变量或者static修饰的局部变量时,block会存放在全局区。
在MRC下:
    block中使用局部变量时或__block修饰的局部变量时,block会存放在栈里面。
    __block修饰的局部变量不会改变属性的生命周期。
在ARC下:
    block中使用局部变量时,block会存放在“堆”里面

__NSMallocBlock__堆
__NSGlobalBlock__全局
__NSStackBlock__栈
int b;//全局变量
static int f = 0;//被static修饰的全局变量,作用域会修改,只能在当前文件下使用。
-(void)ViewLoad{
int a;//局部变量
__block int d;//局部变量
static int c;//被static修饰的局部变量,延长生命周期,跟整个应用程序有关,被static修饰的局部变量,只会分配一次内存,被static修饰的局部变量,程序一运行就会给static修饰的变量分配内存。
}

大家一步一步来:

创建叁个Person类,自身完结

示例2

1.在Person类中

@interface Person : NSObject- eat:)block;@end@implementation Person- eat:block{ block();}@end

2.在ViewController类中

- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // 方式1.先定义,在赋值 // void = ^() { // NSLog; // }; // // [p eat:block]; // 方式2.直接写block [p eat:^{ NSLog; }];}

思考: 想要完毕链式编制程序,就是亟需 有个别实例对象,调用了有些方法,再次回到的依旧以此实例对象自己,那样就能够持续调用别样的法子了

示例3

1.在Person类中

@interface Person : NSObject- run;@end@implementation Person- run{ return ^{ NSLog(@"跑了--%d米",b); };}@end

2.在ViewController类中

- touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ p.run;}
MRC补充:
在Person.h里:
// 链式语法. -->就是连续调用, [[person run] eat],这种.或是[[person eat] run]这种.需要返回值是它本身-run1;-eat1;
MRC下没有strong和weak。有assign,retain,copy。
MRC下使用copy才会将block放在堆里面,并且要使用self来访问,
而不要使用下划线来访问。如果使用retain修饰的block会放在栈里面,会自动销毁。
MRC下没有强指针,默认一个对象就是基本类型。
MRC 下:
block引用局部变量,block放在栈区(和局部变量的位置一样)。
block没有使用局部变量(static修饰的局部变量时,变量生命周期延长和app一样)(因为MRC下没有强弱指针,都是基本数据类型,所以都放栈里保存),block放在全局区。
ARC下:
局部变量默认都是强指针,所以block只要引用了局部变量,block放在堆里面。
在Person.m里:
//下面返回的是其本身,这样就能 使用链式语法,返回还是器本身,就能再继续调用其他的-run1 { NSLog(@"%s",__FUNCTION__); return self;}-eat1 { NSLog(@"%s",__FUNCTION__); return self;}

在ViewController.m里
 //1 >链式编程,使用链式语法 [[person run1] eat1]; //可以这样写 [[person eat1] run1]; //也可以调换顺序,这样写
block声明、定义、取别名
合计: 想要使用函数编制程序语法, 正是想方法使用小括号'(卡塔尔'. 在OC中,唯有调用block的时候,才会利用'(卡塔尔',所以咱们要使得run2那几个措施的再次来到值是block.

本文由澳门威利斯人发布于网络资讯,转载请注明出处:block三种应用场景,iOS函数编程和链式编程

关键词: 澳门威利斯人 场景 IOS 三种 ios开发笔记