iOS开发中将block作为参数、属性使用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发中将block作为参数、属性使用相关的知识,希望对你有一定的参考价值。
参考技术A 开发中使用block进行回调传递消息、传递参数还是很方便的。1.使用一个网络请求工具进行某个页面的网络数据请求,在数据请求下来之后使用block回调,将请求下来的网络数据返回给某个页面使用。
2.点击自定义的UITableViewCell上的一个按钮,使用block回调,让我们知道点击的是哪个cell。
1.将block作为参数使用
2.将block作为属性使用
下面直接看图:
block如果作为参数使用,那么我们既可以在对象方法中使用block,也能在类方法中使用block。如果没有必要创建对象,那就直接使用类方法。
****本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊***
iOS开发——Block使用小结
Block语法看上去好像很特别,但它实际上是作为极普通的C语言源代码处理的。Block的实质,就是Objective-C的对象。
1、Block的语法
^ 返回值类型 参数列表 表达式
可省略返回值类型:^ 参数列表 表达式。省略返回值类型时,如果表达式中有return语句就使用该返回值的类型,如果表达式中没有return语句,就使用void类型。
再省略参数列表:^ 表达式。这个就是大家最熟知的记叙方式。
int val = 10;
void (^blk)(void) = ^{
printf("val = %d\n",val);
};
blk();
2、__block说明符
若想在Block语法的表达式中将值赋给在Block语法外声明的自动变量,需要在该自动变量上附加__block说明符。不然就会产生编译错误。
__block int val = 10;
void (^blk)(void) = ^{
val = 11;
};
blk();
printf("val = %d\n",val);
3、Block循环引用
先看看下面的源代码吧!
typedef void(^blk_t)(void);
@interface MyObject : NSObject{
blk_t blk_;
}
@end
@implementation MyObject
- (id)init {
self = [super init];
blk_ = ^{
NSLog(@"self = %@",self);
};
return self;
}
@end
MyObject类对象的Block类型成员变量blk_持有赋值为Block的强引用。即MyObject类对象持有Block。init实例方法中执行的Block语法使用持有__strong修饰符的id类型变量self。并且由于Block语法赋值在了成员变量blk_中,因此通过Block语法生成在栈上的Block此时由栈复制到堆,并持有所使用的self。self持有Block,Block持有self。这正是循环引用。
为避免循环引用,可声明附有__weak修饰符的变量,并将self赋值使用。
- (id)init {
self = [super init];
id __weak tmp = self;
blk_ = ^{
NSLog(@"self = %@",tmp);
};
return self;
}
以上是关于iOS开发中将block作为参数、属性使用的主要内容,如果未能解决你的问题,请参考以下文章