[Block retain]

[2015-8-13]

  1. Block = [globleblock retain]//Block仍在globle
  2. Block = [stackblock retain]//Block仍在stack
  3. Block = [globleblock copy]//Block仍在globle
  4. Block = [stackblock copy]//Block在heap,类型为__NSMallocBlock__
  5. Block = [mallocblock retain]//Block在heap,类型为__NSMallocBlock__,retainCount始终是1,但内存管理器中仍然会增加,需要谨慎使用
int main(int argc, const char * argv[]) {
    long (^b1)(NSString *) = ^long (NSString* argc){
        return 0;
    };
    int base = 100;
    long (^b3)(NSString *) = ^long (NSString* argc){
        
        return base+0;
    };
    
    long ret = b1(@"Yabao");
    typedef long (^B)(NSString *);
//    long (^b2)(NSString *) = [b1 retain];
    B b2  = [b3 copy];
    B b4  = [b1 copy];
    [b2 retain];
    long ret2 = b3(@"Harry");
    NSMutableArray *first_array = [[NSMutableArray alloc]initWithObjects:@"first",@"second", nil];
    NSLog(@"first_array retainCount = %zi",first_array.retainCount);
//    b2.retainCount;//error Memeber reference base type ‘b‘(aka ‘long (^b1)(NSString *)‘ is not a structure or union)
    [b2 release];//EXC_BAD_ACCESS
//    [b2 release];//EXC_BAD_ACCESS

    [first_array release];
时间: 2024-11-25 11:43:31

[Block retain]的相关文章

IOS中的block 循环引用和retain cycle (经典)

retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于C++的极其非人道的内存管理,Objective-C提出了一些机制来减少内存管理的难度. 比如:内存计数. 在Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release.当我们调用一个对象的retain时,这个对象的内存计数加1,反之,当我们调用relea

对 block 内存管理的一些看法

首先交代一下retain cycle ,和 产生retain cycle后我们应该怎么处理. 1.retain cycle在block中是极易产生,block就是一段可以灵活使用的代码,你可以把它当做变量传递,赋值,甚至可以把它声明到函数体中.更加灵活的是它可以引用它的承载着(即就是block的运行环境),但是这样子就更容易产生retain cycle了 .就是简单说类比 子控件拥有父控件的引用,而父控件也拥有子控件的引用.这样相互引用.就不能形成父控件释放也能将子控件释放.这就造成一个内存泄露

OC语言的特性(二)-Block

本篇文章的主要内容 了解何谓block. 了解block的使用方法. Block 是iOS在4.0版本之后新增的程序语法. 在iOS SDK 4.0之后,Block几乎出现在所有新版的API之中,换句话说,如果不了解Block这个概念就无法使用SDK 4.0版本以后的新功能,因此虽然Block本身的语法有点难度,但为了使用iOS的新功能我们还是得硬着头皮去了解这个新的程序概念. 一.看一看什么是Block 我们使用'^'运算符来声明一个Block变量,而且在声明完一个Block变量后要像声明普通

block的学习(block和timer的循环引用问题)

一.什么是回调函数? 回调函数,本质上也是个函数(搁置函数和方法的争议,就当这二者是一回事).由"声明"."实现"."调用"三部分组成. 在上面的例子中,我可以看出,函数amount(其实是Block),的声明和调用在A类中,而实现部分在B类中.也就是说,B类实现了amount函数,但并没有权限调用,最终还是 由A类触发调用.我们称这样的机制为"回调".意思是"虽然函数的实现写在B类中,但是真正的调用还是得由A类来完

小结OC中Retain cycle(循环引用)

retain cycle 的产生 说到retain cycle,首先要提一下Objective-C的内存管理机制. 作为C语言的超集,Objective-C延续了C语言中手动管理内存的方式,但是区别于C++的极其非人道的内存管理,Objective-C提出了一些机制来减少内存管理的难度. 比如:内存计数. 在 Objective-C中,凡是继承自NSObject的类都提供了两种方法,retain和release.当我们调用一个对象的retain时,这个 对象的内存计数加1,反之,当我们调用rel

block作为类的属性时用copy

1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局部变量 是存在栈上的,其生命周期随函数的生命周期> <堆 :由程序员申请空间地址,由程序员手动释放,生命周期受到程序员控制> 使用retain也可以,因为block的retain行为默认是用copy的行为实现的,block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把

iOS: ARC和非ARC下使用Block属性的问题

1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block). 另一个需要注意的问题是关于线程安全,在声明Block属性时需要确认“在调用Block时另一个线程有没有可能去修改Block?”这个问题,如果确定不会有这种情况发生的话,那么Block属性声明可以用nonatomic.如果不肯定的话(通常情况是这样的),那么你首先需要声明Blo

避免Block的循环引用

避免Block的循环引用 什么是循环引用,什么时候发生循环引用 1 循环引用就是当self 拥有一个block的时候,在block 又调用self的方法.形成你中有我,我中有你,谁都无法将谁释放的困局. self.myBlock = ^{ [self doSomething]; }; +-----------+ +-----------+ | self | | Block | ---> | | --------> | | | retain 2 | <-------- | retain 1

block的使用和注意事项

1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC下返回Block). 另一个需要注意的问题是关于线程安全,在声明Block属性时需要确认“在调用Block时另一个线程有没有可能去修改Block?”这个问题,如果确定不会有这种情况发生的话,那么Block属性声明可以用nonatomic.如果不肯定的话(通常情况是这样的),那么你首先需要声明Blo