在objective-c中使用的具体实现在哪里?



大家好,我是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

最新更新