[Rectangle类]中使用的方法“class”是什么?它是否创建了一个Rectangle实例?我以为那是
Rectangle *aRectangle = [[Rectangle alloc] init].
为什么/何时使用[Rectangle class]?
答案 0 :(得分:1)
以下可能是[Rectangle class]
的两种最常见用途:
您可以使用[Rectangle class]
检查对象是否是Rectangle
的实例(或Rectangle
的子类的实例):
if ([object isKindOfClass:[Rectangle class]]) {
Rectangle *rect = (Rectangle *)object;
// ... use rect
}
但是如果您只有一条要发送的消息,那么最好只检查对象是否理解您要发送的消息:
if ([object respondsToSelector:@selector(area)]) {
double area = [object area];
// etc.
}
您可以使用类对象来创建类的实例:
Class rectangleClass = [Rectangle class];
Rectangle *rectangle = [[rectangleClass alloc] init];
你为什么要那样做?好吧,如果您在要创建它的位置(在您的代码中)明确地知道该类,那么您就不会。例如,您只需说[[Rectangle alloc] init]
。
但请考虑UIView
。每个UIView
创建并管理CALayer
。默认情况下,它会创建CALayer
的实例,但您可能希望视图使用CAShapeLayer
(example)或CAGradientLayer
(example)。您需要一种方法来告诉UIView
创建不同类的实例。
您可以通过覆盖the layerClass
class method告诉您的UIView
子类要创建哪种图层:
@implementation MyShapeView
+ (Class)layerClass {
return [CAShapeLayer class];
}
当MyShapeView
创建其图层时,它将自己发送layerClass
并创建它返回的任何类的实例。代码可能看起来像这样:
@implementation UIView {
CALayer *_layer;
}
- (CALayer *)layer {
if (_layer == nil) {
_layer = [[[self layerClass] alloc] init];
_layer.delegate = self;
}
return _layer;
}