block

  • block方法和代理是可以互换的。

block只能用copy,用strong是没用的:

@property (nonatomic, copy) void (^hideBlock)();// 没有返回值,没有参数

@property (nonatomic, copy) void (^setTitleBlock) (NSString *title);// 没有返回值,带参数

@property (nonatomic, copy) NSString *(^getTitleBlock)();// 返回值是字符串

block里面不能用self,要先转成weak

copy状态下的block(堆里面的block)会对block里面使用的外部变量 强 引用,造成内存泄露。因为循环引用,见下图。解决方法是将block代码中,用的外部变量(self)先赋值给一个声明为weak的变量,之后再block代码中用这个weak变量。__weak ILsSettingViewController *setting = self;

// 此处的void,代表返回值类型是block

typedef void (^StatusSuccessBlock)(NSArray *array);

typedef void (^StatusFailureBlock) (NSError *error);

 

@interface StatusTool : NSObject

// 此处的void,代表返回值类型是block

+ (void)statusesWithSuccess:(StatusSuccessBlock)success andFailure:(StatusFailureBlock)failure;

    //2.声明并赋值定义一个Block变量

    int (^addBlock)(int ,int )= ^(int x,int y){

        return x+ y;

    };

    

    //3.以Block作为函数参数,把参数像对象一样传递

    [self userBlockForOC:addBlock];

    

    //4. 将第2点和第3点合并一起,以内联定义的Block作为函数参数

    [self userBlockForOC:^(int x, int y){

        return x+y;

    }];

    [self userBlockForOC:^int(int x, int y) {

        return x+y;

    }];

    

}

 

//1.定义一个形参为Block的oc函数

- (void)userBlockForOC: (int (^)(int x,int y))aBlock{

    NSLog(@"result = %d", aBlock(300,200));

}

 

 

总结如下:

1.在Block内如果访问self的方法、变量、建议使用weakSef

2.在Block中需要多次访问self,则需要使用StrongSelf

原文地址:https://www.cnblogs.com/dengchaojie/p/4743382.html