[英]Class method used in [Rectangle class]
在[矩形类]中使用的“类”方法是什么? 是否创建Rectangle的实例? 我以为那是
Rectangle *aRectangle = [[Rectangle alloc] init].
为什么/何时使用[矩形类]?
这可能是[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对象创建该类的实例:
Class rectangleClass = [Rectangle class]; Rectangle *rectangle = [[rectangleClass alloc] init];
你为什么想这么做? 好吧,如果您在要创建类的位置(在代码中)显式知道了该类,则不会。 例如,您只需要说[[Rectangle alloc] init]
。
但是考虑一下UIView
。 每个UIView
都会创建和管理一个CALayer
。 默认情况下,它创建CALayer
的实例,但是您可能希望视图使用CAShapeLayer
(示例)或CAGradientLayer
(示例)代替。 您需要一种方法来告诉UIView
创建其他类的实例。
您可以通过覆盖layerClass
类方法来告诉您的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; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.