objective-c – 如何创建自己的方法,以块为参数,稍后可以调用?
发布时间:2020-12-16 07:51:34 所属栏目:百科 来源:网络整理
导读:如何创建自己的方法,以块为参数,稍后可以调用? 我试过以下事情. #import UIKit/UIKit.htypedef void (^viewCreator)(void);@interface blocks2ViewController : UIViewController{}-(void)createButtonUsingBlocks:(viewCreator *)block;@end- (void)viewDi
如何创建自己的方法,以块为参数,稍后可以调用?
我试过以下事情. #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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |