• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

iOSBlock、单例使用

武飞扬头像
客户端技术
帮助5

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhkcgi
系列文章
更多 icon
同类精品
更多 icon
继续加载