【iOS】Block、单例使用总结

【iOS】Block、单例使用总结,第1张

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 使用

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/993588.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存