如何创建自己的方法,以块为参数,稍后可以调用?
我试过以下事情.
#import <UIKit/UIKit.h>
typedef void (^viewCreator)(void);
@interface blocks2ViewController : UIViewController
{
}
-(void)createButtonUsingBlocks:(viewCreator *)block;
@end
- (void)viewDidLoad {
[super viewDidLoad];
[self createButtonUsingBlocks:^(Nsstring * name) {
UIButton *dummyButton = [[UIButton alloc]initWithFrame:CGRectMake(50,50,200,100)];
dummyButton.backgroundColor = [UIColor greenColor];
[self.view addSubview:dummyButton];
}];
}
-(void)createButtonUsingBlocks:(viewCreator *)block
{
// Do something
NSLog(@"inside creator");
}
我也试图将块变量传递给我的自定义方法,但没有任何成功.为什么是这样,什么是正确的方法呢?
更新
这是文件is.h:
#import <UIKit/UIKit.h>
typedef void (^viewCreator)(void);
@interface blocks2ViewController : UIViewController
{
}
- (void)createButtonUsingBlocks:(viewCreator)block;
@end
这是.m文件:
#import "blocks2ViewController.h"
@implementation blocks2ViewController
// Implement viewDidLoad to do additional setup after loading the view,typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
[self createButtonUsingBlocks:^(Nsstring * name) {
UIButton *dummyButton = [[UIButton alloc]initWithFrame:CGRectMake(50,100)];
dummyButton.backgroundColor = [UIColor greenColor];
[self.view addSubview:dummyButton];
[dummyButton release];
}];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data,images,etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
// ...
-(void)createButtonUsingBlocks:(viewCreator)block
{
// viewCreator;
NSLog(@"inside creator");
}
@end
解决方法
首先,如果要让您的块获取字符串参数,则typedef为关闭:
typedef void (^viewCreator)(Nsstring*);
其次,块的类型是:
ReturnType (^)(ParameterTypes...)
并不是
ReturnType (^*)(ParameterTypes...)
因此,不需要添加指向viewCreator类型的指针:
- (void)createButtonUsingBlocks:(viewCreator)block;
第三,你实际上必须调用块,如果你还没有这样做:
-(void)createButtonUsingBlocks:(viewCreator *)block {
block(@"button name");
// ...
第四和最后,UIButton被过度保留 – 你应该释放或自动释放它:
UIButton *dummyButton = [[UIButton alloc] initWithFrame:...]; // ... [self.view addSubview:dummyButton]; [dummyButton release];
一起投掷所有的东西:
#import <UIKit/UIKit.h>
typedef void (^viewCreator)(Nsstring*);
@interface blocks2ViewController : UIViewController {}
-(void)createButtonUsingBlocks:(viewCreator)block;
@end
@implementation blocks2ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self createButtonUsingBlocks:^(Nsstring *name) {
UIButton *dummyButton =
[[UIButton alloc] initWithFrame:CGRectMake(50,100)];
dummyButton.backgroundColor = [UIColor greenColor];
[self.view addSubview:dummyButton];
[dummyButton release];
}];
}
-(void)createButtonUsingBlocks:(viewCreator)block {
block(@"my button name");
}
@end