2015-02-17 2 views

ответ

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, чтобы создать экземпляр другого класса.

    Вы можете сказать своему UIView подкласс, какой слой, чтобы создать путем переопределения the layerClass class method:

    @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; 
    } 
    
+0

Спасибо! Таким образом, [Rectangle class] возвращает класс «Rectangle»? Или он создает новый класс под названием Rectangle? Если первое, в чем разница между высказыванием [Класс прямоугольника} и только Rectangle? И что вы подразумеваете под «объектом класса»? –

+0

И наконец, что именно вы здесь делаете: 'Класс rectangleClass = [Rectangle class]; Прямоугольник * прямоугольник = [[rectangleClass alloc] init]; ' Почему это не так: ' Класс rectangleClass = [Rectangle class]; Прямоугольник * прямоугольник = [[Прямоугольник] init]; ' Что такое rectangleClass? –

+0

'[Rectangle class]' возвращает объект, представляющий класс 'Rectangle'. Если вы будете называть его повторно, вы будете получать тот же объект каждый раз.Говоря '[[rectangleClass alloc] init]', вы позволяете изменять класс во время выполнения, а не фиксироваться во время компиляции. Поскольку 'rectangleClass' является переменной, ему может быть назначен другой объект класса (предположительно, объект класса, представляющий подкласс' Rectangle'). –

Смежные вопросы