[Rectangle类]中使用的类方法

时间:2015-02-17 01:56:03

标签: objective-c class methods

[Rectangle类]中使用的方法“class”是什么?它是否创建了一个Rectangle实例?我以为那是

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

为什么/何时使用[Rectangle class]?

1 个答案:

答案 0 :(得分:1)

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

  1. 您可以使用[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.
    }
    
  2. 您可以使用类对象来创建类的实例:

    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;
    }