Class [矩形class]中使用的方法

Class method used in [Rectangle class]

"class" 方法在 [Rectangle class] 中的用途是什么?它会创建 Rectangle 的实例吗?我以为那是

Rectangle *aRectangle = [[Rectangle alloc] init]. 

Why/When 我会用 [Rectangle class] 吗?

以下可能是 [Rectangle class] 最常见的两种用法:

  1. 您可以使用 [Rectangle class] 来检查对象是否是 Rectangle 的实例(或 Rectangle 的子class 的实例):

    if ([object isKindOfClass:[Rectangle class]]) {
        Rectangle *rect = (Rectangle *)object;
        // ... use rect
    }
    

    但是如果您只有一条消息要发送,最好只检查对象是否理解您要发送的消息:

    if ([object respondsToSelector:@selector(area)]) {
        double area = [object area];
        // etc.
    }
    
  2. 您可以使用 class 对象来创建 class:

    的实例
    Class rectangleClass = [Rectangle class];
    Rectangle *rectangle = [[rectangleClass alloc] init];
    

    你为什么要这样做?好吧,如果您在要创建它的位置(在您的代码中)明确知道 class,您就不会这样做。例如,您只需说 [[Rectangle alloc] init]

    但请考虑 UIView。每个 UIView 创建并管理一个 CALayer。默认情况下,它会创建 CALayer 的实例,但您可能希望视图使用 CAShapeLayer (example) or a CAGradientLayer (example) 来代替。您需要一种方法来告诉 UIView 创建一个不同的 class.

    的实例

    您可以通过覆盖 the layerClass class method:

    来告诉您的 UIView subclass 要创建什么样的层
    @implementation MyShapeView
    
    + (Class)layerClass {
        return [CAShapeLayer class];
    }
    

    MyShapeView 创建其图层时,它会发送自己 layerClass 并创建它返回的任何 class 的实例。代码可能看起来像这样:

    @implementation UIView {
        CALayer *_layer;
    }
    
    - (CALayer *)layer {
        if (_layer == nil) {
            _layer = [[[self layerClass] alloc] init];
            _layer.delegate = self;
        }
        return _layer;
    }