- 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