iOS開發- 關於Block的幾種應用
阿新 • • 發佈:2019-02-08
關於Block,博主不才,簡單分為三種來用:
- 像函式一樣定義和使用,,不同於函式的是可以定義在方法內也可以定義在方法外
- 定義成property的屬性來使用
- 用作修飾詞
接下來一樣樣的來展示;
1.像函式一樣定義和使用,,不同於函式的是可以定義在方法內也可以定義在方法外
1)在方法中使用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *(^thisBlock) (NSString *thisName) = ^(NSString *name){
return [NSString stringWithFormat:@"%@:%@",@"name",name];
};
NSLog(@"%@",thisBlock(@"xiaoming"));
}
2)在方法外使用,就像定義一個方法一樣
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
BlockVoid(24 );
}
void (^BlockVoid) (int age) = ^(int xiaomingAge){
NSLog(@"xiaomingAge:%d",xiaomingAge);
};
總結: 上面倆block也是block的一種寫法不過這麼用的貌似不多見,大多時候這麼寫反而顯得麻煩了(從這裡可以看出,block可以定義在方法內部也可以定義在方法外部,在外部的時候看著是不是更像函數了)
2.定義成property的屬性來使用
這是一種我們經常用的方法,舉個例子
/**
常規無返回值有引數block,比較常用
*/
@property(nonatomic,copy)void (^myBlock) (NSString *name,int age);
/**
常規有返回值有引數block,使用起來其實和上面那個差別不大
*/
@property(nonatomic,copy)NSString *(^haveReturnBlock) (NSString *name);
//用法
- (void)test2
{
_myBlock(@"CodeLiu",24);
}
- (NSString *)test3
{
return _haveReturnBlock(@"小花");
}
除了這個用法,還有一種很好玩的用法,看著比較生動,其實是一樣的:
#import <Foundation/Foundation.h>
/**
定義一個block
@param returnContent 返回值
*/
typedef void(^RetureContentBlock)(id returnContent);
@interface LHBlockForUse : NSObject
/**
用定義的block來宣告一個變數
*/
@property(nonatomic,copy)RetureContentBlock returnBlock;
@end
//用法
- (void)test1
{
_returnBlock(@"You can put every type in here");
}
3.用作修飾詞
在Block內是不能修改Block外的變數的,如果要修改就需要用__block進行修飾
__block int lastAge = 24;
void (^lastAgeBlock) (int age) = ^(int addAge){
lastAge = lastAge + addAge;
NSLog(@"xiaomingLastAge:%d",lastAge);
};
lastAgeBlock(1);
以上是Block的簡單應用,如果哪裡寫的不好歡迎指正,下載地址:Block 的簡單使用