105,block的注意事项

来源:互联网 发布:java会员积分系统源码 编辑:程序博客网 时间:2024/04/29 14:50

#import <Foundation/Foundation.h>


@interface Person : NSObject


-(void)test;


@end


@implementation Person


-(void)test{

    NSLog(@"Person!");

}


@end


int main(int argc,const char * argv[]) {

    //1block中可以访问外面的变量

    //2block中可以定义和外界同名的变量,并且如果仔block中定义了和外界同名的变量,在block中访问的是block中的变量

    /*

      3,默认情况下,不可以在block中修改外界变量的值

        >因为block中的变量跟往外面的变量不是同一个变量,block中访问外界变量,block会把外界变量拷贝一份到堆内存中,所以,修改拷贝后的变量并不影响外界的变量

     */

    

     /*

      4,如果想在block中修改外面变量的值,必须仔外界变量前面加上__block

      注:没有加__block,就是值传递,加了__block就是地址传递(引用传递)

      */

    

    __block int num =10;

    void (^changeNum)() = ^{

        num = 20;

    };

    changeNum();

    NSLog(@"num = %i",num);

    

    /*

     5,面试题:block是存储在栈中还是堆中?

        >默认情况下,block存储在栈中,如果对block进行一个copy操作,block会转移到堆中,如果block仔栈中,block中访问外界的对象,那么,就不会对对象进行retain操作了,但是如果block在堆中,block中访问外界的对象,那么,会对对象进行retain依次。如果在block中访问外界的对象,一定要给对象加__block,无论是堆中,都不会对对象进行retain

     

     */

    __block Person *person = [[Personalloc]init];

    NSLog(@"retainCount = %lu",[personretainCount]);

    

    void (^accessPerson)() = ^{

        [person test];

    };

    accessPerson();

    NSLog(@"retainCount = %lu",[personretainCount]);

    return 0;

}


//2015-12-18 15:05:40.335 12block的注意点[2497:170739] num = 20

//2015-12-18 15:05:40.336 12block的注意点[2497:170739] retainCount = 1

//2015-12-18 15:05:40.336 12block的注意点[2497:170739] Person!

//2015-12-18 15:05:40.336 12block的注意点[2497:170739] retainCount = 1

//Program ended with exit code: 0

0 0
原创粉丝点击