block的循环引用要注意
加 __weak避免循环引用
__weak ViewController *weakSelf = self;
1.block的声明
//声明一个block
typedef NSString *(^WXYTestBlock)(NSString *name, int age);
- (void)printWithName:(NSString *)name age:(int)age block:(WXYTestBlock)block;
以上声明了一个名字叫做WXYTestBlock的block,参数为一个字符串类型的name和一个int类型的age,返回值为NSString。
当然,你也可以声明成这样:
typedef void (^WXYTestBlock)(void);
无参数,无返回值。
2.block的使用
首先是独立block
//独立block
WXYTestBlock myBlock = ^ (NSString *name, int age){
return [NSString stringWithFormat:@"%@的年龄是%d",name,age];
};
NSLog(@“独立block—>%@”, myBlock(@“小宇”, 16));
独立block可以直接定义和使用,运行输出如下
2015-06-03 23:32:32.532 WXYBlock[3537:237755] 独立block—>小宇的年龄是16
//使用内联block的方法
- (void)printWithName:(NSString *)name age:(int)age block:(WXYTestBlock)block{
NSLog(@"内联block--->%@",block(name, age));
}
内联block需要将定义的block作为参数传入相应的方法中,然后在方法中使用block。
//内联block
[self printWithName:@"王兴宇" age:26 block:^(NSString *str, int age){
return [NSString stringWithFormat:@"%@的年龄是%d", str, age];
}];
内联block可以在调用方法的时候写入代码块,运行结果如下
2015-06-03 23:32:32.532 WXYBlock[3537:237755] 内联block—>王兴宇的年龄是26
1 ChesiView
//block的声明
typedef void(^NameBlock)(void);
typedef NSString*_Nullable(^NameBlock2)(void);
typedef NSString*_Nullable(^NameBlock3)(NSString *str);
@property (nonatomic,copy)NameBlock nameBlock;
@property (nonatomic,copy)void(^nameTypeBlock)(void);
@property (nonatomic,copy)void(^nameTypeBlock1)(NSString *str,NSInteger index);
@property (nonatomic,copy)NameBlock2 nameBlock2;
@property (nonatomic,copy)NameBlock3 nameBlock3;
//外部对block是否持有进行判断,必须写
if (self.nameBlock) {
self.nameBlock();
}
if (self.nameTypeBlock) {
self.nameTypeBlock();
}
if (self.nameTypeBlock1) {
self.nameTypeBlock1(@"123", 12);
}
if (self.nameBlock2) {
// self.nameBlock2();
NSLog(@"%@",self.nameBlock2());
}
if (self.nameBlock3) {
NSLog(@"%@",self.nameBlock3(@"name3"));
}
2 ViewController
ChesiView *cheV = [[ChesiView alloc] init];
_cheV = cheV;
[self.view addSubview:cheV];
__weak typeof(self)weakSelf = self;//弱引用的实现,防止
cheV.nameBlock = ^{
__strong typeof(weakSelf)strongSelf = weakSelf;//强引用配合弱引用
NSLog(@"chenggong");
[strongSelf ceshi];
};
cheV.nameTypeBlock = ^{
__strong typeof(weakSelf)strongSelf = weakSelf;//强引用配合弱引用
NSLog(@"nametypeblock");
[strongSelf ceshiType];
};
cheV.nameTypeBlock1 = ^(NSString * _Nonnull str, NSInteger index) {
NSLog(@"%@,%zd",str,index);
};
cheV.nameBlock2 = ^NSString * _Nullable{
return @"232323232";
};
cheV.nameBlock3 = ^NSString * _Nullable(NSString * _Nonnull str) {
return [NSString stringWithFormat:@"%@qwertgtt",str];
};
单例
1.单例的优点(主要优点)
单例可以保证系统中该类有且仅有一个实例,所以很便于外界访问.
因为其上面的特点,对于项目中的个别场景的传值,存储状态等等更加方便
2.单例的缺点(主要缺点)
单例实例一旦创建,对象指针是保存在静态区的,那么在堆区分配空间只有在应用程序终止后才会被释放
单例不能继承
*+ (instancetype)sharedSingleton {
static Singleton _sharedSingleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//不能再使用alloc方法
//因为已经重写了allocWithZone方法,所以这里要调用父类的分配空间的方法
_sharedSingleton = [[super allocWithZone:NULL] init];
});
return _sharedSingleton;
}
// 跟上面的方法实现有一点不同
+ (instancetype)sharedSingleton {
static Singleton *_sharedSingleton = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 要使用self来调用
_sharedSingleton = [[self alloc] init];
});
return _sharedSingleton;
}
参考:
Block 使用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)