大家好,我是objective c的新手。下面的代码不是我的。我只是想弄明白它是怎么运作的。我有一个ViewController,它在。h文件中有这个属性。
@property (nullable, nonatomic, copy) dispatch_block_t logHandler;
在.m文件中,当按下按钮时调用logHandler,代码如下:
- (IBAction)login:(id)sender {
if (nil != self.logHandler) {
self.logHandler();
}
}
然后调用存在于另一个类NSObject文件中的logHandler
在。h文件
@interface LogFlow : NSObject<TheFlowController>
@end
和.m文件
- (UIViewController *)rootViewController {
LogViewController *viewController = LogViewController.newInstance;
viewController.logHandler = ^{
UIViewController *logController = [self startNewLogFlow];
[self.navigationController pushViewController:logController animated:YES];
};
return viewController;
}
我不明白为什么logHandler存在于另一个类中,为什么它是从这个特定的类中调用的,以及如何可能从另一个类调用此代码而不使用任何导入?我试图了解何时使用这种实现以及如何使用它。谢谢你的帮助。
您在rootViewController
中看到的结构:
^{
UIViewController *logController = [self startNewLogFlow];
[self.navigationController pushViewController:logController animated:YES];
};
这就是所谓的"Block"在objective - c中。您可能会在其他语言中找到它作为"匿名函数"的引用。或者一个"闭包"。这些名称在这里也适用。
创建的对象只是一个函数,但函数没有名称。您还可以将未命名的函数赋值给变量,并从变量调用它——这里就是这样做的。匿名函数块被分配给viewController
对象的logHandler
实例变量。稍后,其他代码可以通过变量调用该函数,就像您在login:
示例中看到的那样。
这里有一个简单的block,就是Objective-C:
int squareFunction(int x) {
return x * x;
}
void playWithSquares(void);
void playWithSquares(void) {
int nine = squareFunction(3);
int alsoNine = (^(int x){
return x * x;
})(3);
}
squareFunction
的声明创建了一个命名函数,用于计算两个整数的平方。
你还可以看到表达式:
^(int x){
return x * x;
};
这也创建了一个计算整数平方的函数,但它没有将该函数绑定到名称。由于它没有名称,我们通过将其括在括号中然后传递参数(<anonymous function expression>)(3)
来立即调用该函数可以将匿名函数存储在变量中:
typedef int (^SquaresBlock)(int);
SquaresBlock myBlock = ^(int x){
return x * x;
};
然后使用squaresBlock(3)
调用它block在Cocoa对Objective-C的使用中非常重要,所以你应该更多地了解它们。
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html