如何在另一个类中调用块定义为属性?

时间:2017-03-24 09:24:44

标签: ios objective-c objective-c-blocks

我正在调用第二类中的块,它已在第一类声明和维护。

在ViewController.h中

@property (copy) void (^simpleBlock)(NSString*);

在View Controller.m中

- (void)viewDidLoad {
    [super viewDidLoad];

    self.simpleBlock = ^(NSString *str)
    {
        NSLog(@"Hello My Name is: %@",str);
    };
}

在SecondViewController.m中

在ViewDidload中

ViewController *VC = [[ViewController alloc]init];
VC.simpleBlock(@"Harjot");//bad execution error 

请给我一些解决方案,因为代码给我的执行错误。 我怎么能用其他方式调用块?

1 个答案:

答案 0 :(得分:1)

运行块的正确方法。但是,如果您尝试运行nil的块,则会发生崩溃 - 因此在调用之前应始终检查它是否为nil

ViewController *vc = [[ViewController alloc] init];
if (vc.simpleClock) {
   vc.simpleBlock(@"Harjot");//this will not get called
}

在您的情况下,阻止为nil的原因是因为您在viewDidLoad中进行了设置 - 但是在其视图准备好进入屏幕之前,不会调用viewDidLoad。出于测试目的,尝试将作业从viewDidLoad移至init,这应该有效:

- (instancetype)init 
{
   self [super init];
   if (self) {
      _simpleBlock = ^(NSString *str)
      {
          NSLog(@"Hello My Name is: %@",str);
      };
   }
   return self;
}