对block,单例模式的理解及使用

1.block的使用与理解:

 (1)block是一个独立的代码块,可以当做参数传,从而提高代码的复用性与可读性。

 (2)block可以当做函数的参数传递:-(void)getArea:(void(^)(int W,int H))block;

   (3)  block也可以当做属性传值:@property(nonatomic,copy)void(^block)(NSString *)name

  ***注意:block作属性传值的时候,要用copy修饰,因为block是分配在栈里面的不需要程序员手动管理,但是我们使用时是在堆里面操作所以需要copy一份进行操作;当在block里面进行操作时,初始化变量,在block外要记得用__block(MRC中,ARC用__weak修饰符)对实例变量进行修饰,从而避免循环应用。

例子:

[html]  view plain copy
  1. brush.getCardInfo=^(NSDictionary *info){  
  2.     [self test];  
  3. };  
像上面这段代码,self其实是一个本地变量而不是block内部变量,如果声明为assign,代码执行到block内部就会出错。

但是这又带来另一个问题,就是self的引用计数+1。这意味着很可能会导致循环引用。self持有brush,brush持有block,block持有self。结果就是内存泄漏。

解决的办法如下:

[plain]  view plain copy
  1. __block CurrentViewController* blockSelf = self;  
  2. brush.getCardInfo=^(NSDictionary *info){  
  3.         [blockSelf test];  
  4. };  

 

 

通过这个方式,告诉block这个变量的引用计数不要+1。


2.单例的理解与使用:

(1)单例模式就是一个实例,保证一个类只有一个实例,单例的方法是一个类方法,保证类中的对象只会被初始化一次,从而避免对象里面的数据再次初始化而清空。

(2)单列的优点

01.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
   02.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

(3)在oc中创建单例类的步骤:

01.声明一个静态变量并置为空:static Tree *tree = nil;

02.实现单例的方法:

+(id)manager

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        

        trees = [[Tree alloc]init];

        NSLog(@"我是一个单列");

    });

    

    return trees;

}

在另一个类调用时,只需要用单例的类调用即可。

+

+

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值